我有一个Dataframe。 为简单起见,我们假设这是我的df:
A B C
1 4 7
1 5 4
1 6 2
我想要做的是按A
和B
进行分组,其中一组B
为[4,6]
,另一组为5
。
我们在Sum
上说我的聚合函数是C
,所以我希望结果为:
A B Sum(C)
1 [4,6] 9
1 5 4
我知道我可以添加一个额外的列来指示该值是否在[4,6]中,但是有更优雅的方式吗?
答案 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()