3 votes

Ajouter le nombre de fois qu'une chaîne de caractères apparaît dans le cadre de données Pandas à une autre colonne.

Je voudrais créer une colonne supplémentaire sur ce cadre de données :

Index                  Value
0                22,88,22,24
1                      24,24
2                      22,24
3    11,22,24,12,24,24,22,24
4                         22

Ainsi, le nombre de fois qu'une valeur apparaît est stocké dans une nouvelle colonne :

Index                  Value     22 Count
0                22,88,22,24            2
1                      24,24            1
2                      22,24            1
3    11,22,24,12,24,24,22,24            2
4                         22            1

J'aimerais répéter ce processus pour un certain nombre de valeurs différentes dans le cadre de la value colonne.

Mes connaissances minimales de Python me disent quelque chose comme :

df['22 Count'] = df['Value'].count('22')

J'ai essayé cette version et d'autres, mais il doit me manquer quelque chose.

3voto

jezrael Points 290608

Si vous voulez compter une seule valeur, utilisez str.count :

df['22 Count'] = df['Value'].str.count('22')
print (df)
                         Value  22 Count
Index                                   
0                  22,88,22,24         2
1                        24,24         0
2                        22,24         1
3      11,22,24,12,24,24,22,24         2
4                           22         1

Pour tous les besoins de comptage des colonnes :

from collections import Counter

df1 = df['Value'].apply(lambda x: pd.Series(Counter(x.split(','))), 1).fillna(0).astype(int)

Ou :

df1 = pd.DataFrame([Counter(x.split(',')) for x in df['Value']]).fillna(0).astype(int)

Ou :

from sklearn.feature_extraction.text import CountVectorizer

countvec = CountVectorizer()
counts = countvec.fit_transform(df['Value'].str.replace(',', ' '))
df1 = pd.DataFrame(counts.toarray(), columns=countvec.get_feature_names())

print (df1)
   11  12  22  24  88
0   0   0   2   1   1
1   0   0   0   2   0
2   0   0   1   1   0
3   1   1   2   4   0
4   0   0   1   0   0

Enfin, si nécessaire, ajoutez à l'original :

df = df.join(df1.add_suffix(' Count'))
print (df)
                         Value  11 Count  12 Count  22 Count  24 Count  \
Index                                                                    
0                  22,88,22,24         0         0         2         1   
1                        24,24         0         0         0         2   
2                        22,24         0         0         1         1   
3      11,22,24,12,24,24,22,24         1         1         2         4   
4                           22         0         0         1         0   

       88 Count  
Index            
0             1  
1             0  
2             0  
3             0  
4             0

0voto

jpp Points 83462

Compte isolé

Vous êtes proche. Mais votre syntaxe tente de traiter une série comme s'il s'agissait d'une liste. Au lieu de cela, vous pouvez utiliser la fonction count méthode après conversion en list :

from operator import methodcaller

df['22_Count'] = df['Value'].str.split(',').apply(methodcaller('count', '22'))

print(df)

   Index                    Value  22_Count
0      0              22,88,22,24         2
1      1                    24,24         0
2      2                    22,24         1
3      3  11,22,24,12,24,24,22,24         2
4      4                       22         1

Plusieurs chefs d'accusation

Utilisez les méthodes montré par @jezrael .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X