我有一个数据帧,应将其分组,然后在每个组上应用几个功能。通常,我会使用groupby().agg()
(参见Apply multiple functions to multiple groupby columns)来执行此操作,但是我感兴趣的功能不需要一列作为输入,而需要多列。
我了解到,当我有一个具有多个列作为输入的一个函数时,我需要apply
(参见Pandas DataFrame aggregate function using multiple columns)。
但是,当我有多个输入多列的多个函数时,我需要什么?
import pandas as pd
df = pd.DataFrame({'x':[2, 3, -10, -10], 'y':[10, 13, 20, 30], 'id':['a', 'a', 'b', 'b']})
def mindist(data): #of course these functions are more complicated in reality
return min(data['y'] - data['x'])
def maxdist(data):
return max(data['y'] - data['x'])
我会期望像df.groupby('id').apply([mindist, maxdist])
min max
id
a 8 10
b 30 40
(通过pd.DataFrame({'mindist':df.groupby('id').apply(mindist),'maxdist':df.groupby('id').apply(maxdist)}
实现-如果我要在分组数据帧上应用许多函数,这显然不是很方便)。最初,我以为this OP有相同的问题,但是他似乎对aggregate
很好,这意味着他的函数只接受一列作为输入。
答案 0 :(得分:2)
对于这个特定问题,groupby
区别之后怎么样?
(df['x']-df['y']).groupby(df['id']).agg(['min','max'])
更笼统地说,您可以做类似的事情
df.groupby('id').apply(lambda x:pd.Series({'min':mindist(x),'max':maxdist(x)}))
答案 1 :(得分:1)
您想在同一组中使用多个IIUC功能。在这种情况下,您应该返回pd.Series
。在下面的玩具示例中,我想
A
和B
的总和,然后计算平均值C
和D
的总和,然后计算标准差import pandas as pd
df = pd.util.testing.makeDataFrame().head(10)
df["key"] = ["key1"] * 5 + ["key2"] * 5
def fun(x):
m = (x["A"]+x["B"]).mean()
s = (x["C"]+x["D"]).std()
return pd.Series({"meanAB":m, "stdCD":s})
df.groupby("key").apply(fun)
更新 在您的情况下变成了
import pandas as pd
df = pd.DataFrame({'x':[2, 3, -10, -10],
'y':[10, 13, 20, 30],
'id':['a', 'a', 'b', 'b']})
def mindist(data): #of course these functions are more complicated in reality
return min(data['y'] - data['x'])
def maxdist(data):
return max(data['y'] - data['x'])
def fun(data):
return pd.Series({"maxdist":maxdist(data),
"mindist":mindist(data)})
df.groupby('id').apply(fun)