我有一个这样的数据框。
mydf = pd.DataFrame({'a':[1,1,3,3],'b':[np.nan,2,3,6],'c':[1,3,3,9]})
a b c
0 1 NaN 1
1 1 2.0 3
2 3 3.0 3
3 3 6.0 9
我想要一个这样的结果数据框。
myResults = pd.concat([mydf.groupby('a').apply(lambda x: (x.b/x.c).max()), mydf.groupby('a').apply(lambda x: (x.b/x.c).min())], axis =1)
myResults.columns = ['max','min']
max min
a
1 0.666667 0.666667
3 1.000000 0.666667
基本上,我希望每个组(按column b
分组)的column c
和column a
的最大和最小比率
是否可以通过agg
实现?
我尝试了mydf.groupby('a').agg([lambda x: (x.b/x.c).max(), lambda x: (x.b/x.c).min()])
。它将不起作用,并且似乎无法识别列名b
和c
。
我能想到的另一种方法是将比率列首先添加到mydf
中。即mydf['ratio'] = mydf.b/mydf.c
,然后在agg
之类的更新后的mydf
上使用mydf.groupby('a')['ratio'],agg[max,min]
。
是否有更好的方法通过agg或其他功能来实现?总而言之,我想将自定义函数应用于分组的DataFrame,并且自定义函数需要从原始DataFrame读取多列。
答案 0 :(得分:0)
您可以使用自定义功能来实现此目的。
使用以下功能,您可以使用任何输入列创建任意数量的新列。
def f(x):
t = {}
t['max'] = (x['b']/x['c']).max()
t['min'] = (x['b']/x['c']).min()
return pd.Series(t)
mydf.groupby('a').apply(f)
输出:
max min
a
1 0.666667 0.666667
3 1.000000 0.666667