2
votes

Boucle for imbriquée à l'aide de la fonction lambda

J'ai une boucle for imbriquée quelque chose comme:

for x in df['text']:
  for i in x:
    if i in someList:
      count++

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?


1 commentaires

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.


3 Réponses :


3
votes

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)


0 commentaires

2
votes

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)


4 commentaires

@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.



2
votes

Setup
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

Numpy et __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]

0 commentaires