我来自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,然后按频率列进行过滤。我是否需要删除未使用的列并手动添加频率列?通常的做法是什么?
答案 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