为什么Pandas中的groupby位于现有列名下?

时间:2017-11-26 10:54:51

标签: pandas pandas-groupby

我来自R并且不了解pandas中的默认groupby行为。我创建了一个数据帧,并按列'id'分组,如下所示:

d = {'id': [1, 2, 3, 4, 2, 2, 4], 'color': ["r","r","b","b","g","g","r"], 'size': [1,2,1,2,1,3,4]}
df = DataFrame(data=d)
freq = df.groupby('id').count()

当我检查结果数据帧的标题时,所有原始列都在那里,而不仅仅是'id'和'freq'(或'id'和'count')。

list(freq)
Out[117]: ['color', 'size']

当我显示结果数据帧时,计数已替换计数中未使用的列的值:

freq
Out[114]: 
    color  size
id             
1       1     1
2       3     3
3       1     1
4       2     2

我计划使用groupby,然后按频率列进行过滤。我是否需要删除未使用的列并手动添加频率列?通常的做法是什么?

1 个答案:

答案 0 :(得分:3)

count汇总DataFrame的所有列并排除NaN个值,如果需要id作为列使用as_index=False参数或reset_index()

freq = df.groupby('id', as_index=False).count()
print (freq)
   id  color  size
0   1      1     1
1   2      3     3
2   3      1     1
3   4      2     2

因此,如果在每列中添加NaN应该是差异:

d = {'id': [1, 2, 3, 4, 2, 2, 4], 
     'color': ["r","r","b","b","g","g","r"],
      'size': [np.nan,2,1,2,1,3,4]}
df = pd.DataFrame(data=d)

freq = df.groupby('id', as_index=False).count()
print (freq)
   id  color  size
0   1      1     0
1   2      3     3
2   3      1     1
3   4      2     2

您可以指定计数列:

freq = df.groupby('id', as_index=False)['color'].count()
print (freq)
   id  color
0   1      1
1   2      3
2   3      1
3   4      2

如果count需要NaN

freq = df.groupby('id').size().reset_index(name='count')
print (freq)
   id  count
0   1      1
1   2      3
2   3      1
3   4      2
d = {'id': [1, 2, 3, 4, 2, 2, 4], 
     'color': ["r","r","b","b","g","g","r"],
      'size': [np.nan,2,1,2,1,3,4]}
df = pd.DataFrame(data=d)

freq = df.groupby('id').size().reset_index(name='count')
print (freq)
   id  count
0   1      1
1   2      3
2   3      1
3   4      2

感谢Bharath指出了value_counts的另一个解决方案,解释了差异here

freq = df['id'].value_counts().rename_axis('id').to_frame('freq').reset_index()
print (freq)
   id  freq
0   2     3
1   4     2
2   3     1
3   1     1