将在Pandas数据框中出现字符串的次数追加到另一列

时间:2018-07-10 06:22:51

标签: python pandas dataframe counting

我想在此数据框上创建一个额外的列:

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

因此,将值出现的次数存储在新列中:

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

我想对value列中的多个不同值重复此过程。

我对Python的基本了解告诉我:

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

我已经尝试过这个版本和其他一些版本,但是我一定缺少一些东西。

2 个答案:

答案 0 :(得分:3)

如果只想计算一个值,请使用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

对于所有列都需要计数:

from collections import Counter

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

或者:

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

或者:

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

最后一次添加到原始文件中:

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  

答案 1 :(得分:0)

隔离计数

您很近。但是您的语法会尝试将一系列视为列表。相反,您可以在转换为count后使用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

多个计数

使用方法shown by @jezrael