J'ai deux listes qui contiennent des termes sous forme de chaînes. Ces termes appartiennent à deux catégories: les fruits et les véhicules. J'essaie d'afficher une trame de données contenant uniquement des paires de termes de catégories en conflit. Quelle serait la meilleure approche pour y parvenir? Vous trouverez ci-dessous un exemple de ma liste et une trame de données. Toute aide serait grandement appréciée!

  dataframe:

         col 1                 
  ['apple', 'truck' ]
  ['truck', 'orange']
  ['pear',  'motorcycle']
  ['pear', 'orange' ]
  ['apple', 'pear'  ]
  ['truck', 'car'   ]


  vehicles = ['car', 'truck', 'motorcycle']
  fruits = ['apple', 'orange', 'pear']


  desired output:

        col 2

  ['apple', 'truck' ]
  ['pear', 'motorcycle']
  ['truck', 'orange']
3
Matthew 15 mars 2019 à 14:46

2 réponses

Meilleure réponse

Créez DataFrame à partir de la colonne des listes, testez l'adhésion par DataFrame.isin, puis inversez les masques de ~, vérifiez au moins un True par ligne avec DataFrame.any pour les listes et les conditions de la dernière chaîne par ET au niveau du bit - & avec filtrage par boolean indexing :

df1 = pd.DataFrame(df['col 1'].values.tolist())
df = df[(~df1.isin(vehicles)).any(axis=1) & (~df1.isin(fruits)).any(axis=1)]
print (df)
                col 1
0      [apple, truck]
1     [truck, orange]
2  [pear, motorcycle]

Une autre solution avec l'intersection de sets enchaînés par and (car les scalaires) et convertis en bool - les ensembles vides sont convertis en False :

def func(x):
    s = set(x)
    v = set(vehicles)
    f = set(fruits)
    return bool((s & v) and (s & f))

df = df[df['col 1'].apply(func)]
print (df)
                col 1
0      [apple, truck]
1     [truck, orange]
2  [pear, motorcycle]
5
jezrael 15 mars 2019 à 12:10

Peut-être que np.isin pourrait vous être utile!

super_set = np.array([vehicles,fruits])

def f(x):
    return all(np.isin(super_set,x).sum(axis=1))

df[df.col1.apply(f)]

#
col1
0   [apple, truck]
1   [truck, orange]
2   [pear, motorcycle]
0
Venkatachalam 15 mars 2019 à 12:34