Python Pandas groupby() 结果

27

我有以下Python Pandas数据框:

df = pd.DataFrame( {
   'A': [1,1,1,1,2,2,2,3,3,4,4,4],
   'B': [5,5,6,7,5,6,6,7,7,6,7,7],
   'C': [1,1,1,1,1,1,1,1,1,1,1,1]
    } );

df
    A  B  C
0   1  5  1
1   1  5  1
2   1  6  1
3   1  7  1
4   2  5  1
5   2  6  1
6   2  6  1
7   3  7  1
8   3  7  1
9   4  6  1
10  4  7  1
11  4  7  1

我想要另外一列用于存储在固定A和B情况下C值之和的结果。换句话说,类似于:

    A  B  C  D
0   1  5  1  2
1   1  5  1  2
2   1  6  1  1
3   1  7  1  1
4   2  5  1  1
5   2  6  1  2
6   2  6  1  2
7   3  7  1  2
8   3  7  1  2
9   4  6  1  1
10  4  7  1  2
11  4  7  1  2

我尝试使用pandas的groupby方法,效果还算可以:

res = {}
for a, group_by_A in df.groupby('A'):
    group_by_B = group_by_A.groupby('B', as_index = False)
    res[a] = group_by_B['C'].sum()

但我不知道如何有序地将res中的结果“获取”到df中。对于此问题的任何建议都会让我非常高兴。谢谢。


列 D 计算什么? - Mazz
4个回答

26

这是其中一种方法(虽然我感觉应该可以通过 apply 一次性完成,但我无法做到)。

In [11]: g = df.groupby(['A', 'B'])

In [12]: df1 = df.set_index(['A', 'B'])

size分组函数是您需要的函数,我们必须将其与'A'和'B'匹配为索引:

In [13]: df1['D'] = g.size()  # unfortunately this doesn't play nice with as_index=False
# Same would work with g['C'].sum()

In [14]: df1.reset_index()
Out[14]:
    A  B  C  D
0   1  5  1  2
1   1  5  1  2
2   1  6  1  1
3   1  7  1  1
4   2  5  1  1
5   2  6  1  2
6   2  6  1  2
7   3  7  1  2
8   3  7  1  2
9   4  6  1  1
10  4  7  1  2
11  4  7  1  2

谢谢 @Andy Hayden!我认为使用 sum 的解决方案更通用。事实上,我在 C 中没有 1(当 size 在你的解决方案中完美运作时),而是一些浮点数,所以为了让它正常工作,我需要使用 sum。但无论如何,太棒了,再次感谢。 - Simon Righley
6
我认为你梦寐以求的一行代码是 df['D'] = df.groupby(['A', 'B']).transform(np.size)。在好坏时期,transform 就在那里。:-D - Dan Allan
@DanAllan,列D是如何计算的? - Mazz

15

您还可以使用应用于groupby的transform来完成一行代码:

df['D'] = df.groupby(['A','B'])['C'].transform('sum')

8
您还可以使用合并操作来实现一行代码的解决方案,如下所示:
df = df.merge(pd.DataFrame({'D':df.groupby(['A', 'B'])['C'].size()}), left_on=['A', 'B'], right_index=True)

2
你可以使用以下方法:

你可以使用这种方法:

columns = ['col1','col2',...]
df.groupby('col')[columns].sum()

如果您想要的话,您也可以在.sum()之后使用.sort_values(by = 'colx', ascending = True/False)来按照特定列(colx)以升序或降序对最终输出进行排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接