Warm tip: This article is reproduced from serverfault.com, please click

python- pandas 代码以获取每个值的计数

(python - Pandas code to get the count of each values)

发布于 2020-12-01 06:17:48

在这里,我共享一个示例数据(正在处理大数据),“计数”值的范围从1到3000+,有时甚至更多。

样本数据如下:

          ID                                            counts
41 44 17 16 19 52                                          6

17 30 16 19                                                4

52 41 44 30 17 16                                          6

41 44 52 41 41 41                                          6 

17 17 17 17 41                                             5

我想将“ ID”列分成多个&想获取该计数,

  data= reading the csv_file
 split_data = data.ID.apply(lambda x: pd.Series(str(x).split(" "))) # separating columns

正如我所提到的,我正在处理大数据,所以这种方法不是很有效。.我正面临获取“ ID”计数的问题

我想收集每个ID的总数并将其映射到相应的ID列。

预期产量:

          ID                  counts   16     17     19     30     41     44     52   
41 41 17 16 19 52               6       1     1      1      0      2       0     1

17 30 16 19                     4       1     1      1      1      0       0     0  

52 41 44 30 17 16               6       1     1      0      1      1       1     1

41 44 52 41 41 41               6       0     0      0      0      4       1     1

17 17 17 17 41                  5       0     4      0      0      1       0     0

如果你有任何想法,请告诉我

谢谢

Questioner
dev_user
Viewed
0
jezrael 2020-12-01 14:35:11

使用Counter通过在列表理解空间分裂值获取计数:

from collections import Counter

L = [{int(k): v for k, v in Counter(x.split()).items()} for x in df['ID']]
df1 = pd.DataFrame(L, index=df.index).fillna(0).astype(int).sort_index(axis=1)
df = df.join(df1)
print (df)
                  ID  counts  16  17  19  30  41  44  52
0  41 44 17 16 19 52       6   1   1   1   0   1   1   1
1        17 30 16 19       4   1   1   1   1   0   0   0
2  52 41 44 30 17 16       6   1   1   0   1   1   1   1
3  41 44 52 41 41 41       6   0   0   0   0   4   1   1
4     17 17 17 17 41       5   0   4   0   0   1   0   0

另一个想法,但我想慢一点:

df1 = df.assign(a = df['ID'].str.split()).explode('a')
df1 = df.join(pd.crosstab(df1['ID'], df1['a']), on='ID')
print (df1)
                  ID  counts  16  17  19  30  41  44  52
0  41 44 17 16 19 52       6   1   1   1   0   1   1   1
1        17 30 16 19       4   1   1   1   1   0   0   0
2  52 41 44 30 17 16       6   1   1   0   1   1   1   1
3  41 44 52 41 41 41       6   0   0   0   0   4   1   1
4     17 17 17 17 41       5   0   4   0   0   1   0   0