我有一个数据框,我需要将两个不同的 groupby 与其中一个过滤组合。
ID EVENT SUCCESS
1 PUT Y
2 POST Y
2 PUT N
1 DELETE Y
下表是我希望数据的样子。首先对 'EVENT' 计数进行分组,其次是统计每个 ID 的成功数 ('Y')
ID PUT POST DELETE SUCCESS
1 1 0 1 2
2 1 1 0 1
我已经尝试了一些技术,我发现壁橱是两种不同的方法,它们产生以下结果
group_df = df.groupby(['ID', 'EVENT'])
count_group_df = group_df.size().unstack()
对于“EVENT”计数产生以下结果
ID PUT POST DELETE
1 1 0 1
2 1 1 0
对于带有过滤器的成功,我不知道我是否可以将它加入到'ID'上的第一个集合中
df_success = df.loc[df['SUCCESS'] == 'Y', ['ID', 'SUCCESS']]
count_group_df_2 = df_success.groupby(['ID', 'SUCCESS'])
ID SUCCESS
1 2
2 1
我需要以某种方式组合这些吗?
此外,我还想将两个“EVENT”(例如 PUT 和 POST)的计数合并到一列中。
最佳答案
使用concat
将它们合并在一起:
df1 = df.groupby(['ID', 'EVENT']).size().unstack(fill_value=0)
df_success = (df['SUCCESS'] == 'Y').groupby(df['ID']).sum().astype(int)
df = pd.concat([df1, df_success],axis=1)
print (df)
DELETE POST PUT SUCCESS
ID
1 1 0 1 2
2 0 1 1 1
另一种解决方案 value_counts
:
df1 = df.groupby(['ID', 'EVENT']).size().unstack(fill_value=0)
df_success = df.loc[df['SUCCESS'] == 'Y', 'ID'].value_counts().rename('SUCCESS')
df = pd.concat([df1, df_success],axis=1)
print (df)
DELETE POST PUT SUCCESS
ID
1 1 0 1 2
2 0 1 1 1
最后可以将索引转换为列并删除列名 ID
by reset_index
+ rename_axis
:
df = df.reset_index().rename_axis(None, axis=1)
print (df)
ID DELETE POST PUT SUCCESS
0 1 1 0 1 2
1 2 0 1 1 1
关于python - Pandas 结合两个分组依据,过滤并合并分组(计数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44325204/