如果我有一个函数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))
有更好的方法吗?
谢谢,
答案 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)