pandas groupby并在多列上应用函数

时间:2018-06-14 13:26:17

标签: python pandas pandas-groupby

如果我有一个函数f,我不止一次应用于一组列,那么更多的Pythonic方法是什么。现在,我正在做的就是这个。

newdf=df.groupby(['a', 'b']).apply(lambda x: f(x, 1))
newdf.columns=['1']
newdf['2']=df.groupby(['a', 'b']).apply(lambda x: f(x, 2))
newdf['3']=df.groupby(['a', 'b']).apply(lambda x: f(x, 3))
newdf['4']=df.groupby(['a', 'b']).apply(lambda x: f(x, 4))

有更好的方法吗?

谢谢,

4 个答案:

答案 0 :(得分:2)

这对我来说足够pythonic:

columns_dict = dict()
for i in range(1, 5):
    columns_dict[str(i)] = df.groupby(["a", "b"]).apply(lambda x: f(x, i))

pd.DataFrame(columns_dict)

答案 1 :(得分:1)

你可以这样做:

pandas.DataFrame([df.groupby(['a','b']).apply(lambda x : f(x,i)) for i in range(1,5)])

如果您希望与初始数据帧具有相同的列名,则转置新的DataFrame。

答案 2 :(得分:1)

使用agg()计算单个groupby()的多个值:

df.groupby(['a', 'b']).agg([
    ('1': lambda x: f(x, 1)),
    ('2': lambda x: f(x, 2)),
    ('3': lambda x: f(x, 3)),
    ('4': lambda x: f(x, 4)),
])

或等效地:

df.groupby(['a', 'b']).agg([(str(i), lambda x: f(x, i)) for i in range(1, 5)])

答案 3 :(得分:1)

Pandas groupby.apply接受任意参数和关键字参数,这些参数传递给分组函数。此外,您可以创建字典映射列到参数。最后,您还可以重用groupby对象,该对象可以在循环外定义。

argmap = {'2': 2, '3': 3, '4': 4}

grouper = df.groupby(['a', 'b'])

for k, v in argmap.items():
    newdf[k] = grouper.apply(f, v)