Pandas Groupby基于列中的多个值

时间:2017-07-23 08:14:40

标签: python pandas dataframe group-by

我有一个Dataframe。 为简单起见,我们假设这是我的df:

A B C
1 4 7
1 5 4
1 6 2

我想要做的是按AB进行分组,其中一组B[4,6],另一组为5。 我们在Sum上说我的聚合函数是C,所以我希望结果为:

A   B  Sum(C)
1 [4,6]  9
1   5    4

我知道我可以添加一个额外的列来指示该值是否在[4,6]中,但是有更优雅的方式吗?

2 个答案:

答案 0 :(得分:1)

不太容易。

首先,我使用replace为groupby提供相同的值,然后agg使用自定义函数和sum

#4 and 6 are same group
d = {4:6}
df = df.groupby(['A',df.B.replace(d)]) \
       .agg({'B':lambda x: x.tolist() if len(x) > 1 else x.iat[0], 'C':'sum'}) \
       .reset_index(level=1, drop=True) \
       .reset_index() \
       .reindex_axis(df.columns, axis=1)
print (df)
   A       B  C
0  1       5  4
1  1  [4, 6]  9

如果list s可以是元组:

#define groups of all values of column
d = {'a':[5], 'b':[4,6]}
#create tuples
d = {k: tuple(d[oldk]) for oldk, oldv in d.items() for k in oldv}
print (d)
{4: (4, 6), 5: (5,), 6: (4, 6)}

df = df.groupby(['A', df.B.map(d)])['C'].sum().reset_index()
print (df)
   A       B  C
0  1  (4, 6)  9
1  1    (5,)  4

答案 1 :(得分:-1)

尝试df.groupby([" A"," B"])。sum()