J'ai une boucle for imbriquée quelque chose comme:
for x in df['text']: for i in x: if i in someList: count++
Où df ['text']
est une série de listes contenant des mots tels que [ "mot1", "mot2", "etc"]
Je sais que je peux simplement utiliser le format for
, mais je souhaite le convertir en fonction lambda.
J'ai essayé de faire:
df ['in'] = df ['text']. apply (lambda x: [count ++ for i in x if i in someList])
mais ce n'est pas une syntaxe appropriée. Comment puis-je modifier pour obtenir la fonction que je souhaite?
3 Réponses :
J'ai l'impression que vous devez dépenser la ligne et faire avec isin
, car avec les pandas, nous essayons généralement de ne pas utiliser la boucle for.
df['in']=pd.DataFrame(df['text'].tolist(),index=df.index).isin(someList).sum(1)
Vous n'avez besoin d'aucune fonction supplémentaire. Créez simplement une séquence de uns (une par élément) à additionner.
count = sum(1 for x in df['text'] for i in x if i in someList)
@OP peut également être plus rapide pour utiliser un ensemble au lieu de someList
Cette sortie est-elle une valeur ou une liste?
C'est une valeur; aucune nouvelle liste n'est créée. Une expression de générateur est passée à sum
.
Je dois noter que j'ai une autre colonne dans mon df, «count», où le nombre de chaque texte est placé. Le code fourni résume tous les décomptes que je crois, car ma colonne «décompte» contient tous le même nombre, 60085.
df.assign(**{'in': df.text.map(lambda x: sum(map(someList.__contains__, x)))}) text in 0 [A, B] 2 1 [C, D] 2 2 [A, F] 1 3 [E, G] 0 4 [B, H] 1 5 [I, J] 0 6 [A, C, D, E] 3
__contains__
i = np.arange(len(df)).repeat(df.text.str.len()) a = np.zeros(len(df), int) np.add.at(a, i, [*map(someList.__contains__, np.concatenate(df.text))]) df.assign(**{'in': a}) text in 0 [A, B] 2 1 [C, D] 2 2 [A, F] 1 3 [E, G] 0 4 [B, H] 1 5 [I, J] 0 6 [A, C, D, E] 3
map
lambda
et __contains__
someList = [*'ABCD'] df = pd.DataFrame(dict(text=[*map(list, 'AB CD AF EG BH IJ ACDE'.split())])) df text 0 [A, B] 1 [C, D] 2 [A, F] 3 [E, G] 4 [B, H] 5 [I, J] 6 [A, C, D, E]
pouvez-vous ajouter un exemple de données et une sortie attendue afin que nous n'ayons pas à deviner. Sera également utile pour les futurs lecteurs.