为了获得在groupby数据上执行的结果具有与原始DataFrame相同的详细程度(相同的观察计数),我使用了转换功能。
示例: 原始数据框
name, year, grade
Jack, 2010, 6
Jack, 2011, 7
Rosie, 2010, 7
Rosie, 2011, 8
groupby转换后
name, year, grade, average grade
Jack, 2010, 6, 6.5
Jack, 2011, 7, 6.5
Rosie, 2010, 7, 7.5
Rosie, 2011, 8, 7.5
但是,如果使用基于多列的更高级的功能,事情就会变得更加复杂。让我感到困惑的是,我似乎无法访问groupby-transform组合中的多个列。
df = pd.DataFrame({'a':[1,2,3,4,5,6],
'b':[1,2,3,4,5,6],
'c':['q', 'q', 'q', 'q', 'w', 'w'],
'd':['z','z','z','o','o','o']})
def f(x):
y=sum(x['a'])+sum(x['b'])
return(y)
df['e'] = df.groupby(['c','d']).transform(f)
给我:
KeyError: ('a', 'occurred at index a')
尽管我知道以下方法确实有效:
df.groupby(['c','d']).apply(f)
是什么原因导致这种行为,我如何获得这样的东西:
a b c d e
1 1 q z 12
2 2 q z 12
3 3 q z 12
4 4 q o 8
5 5 w o 22
6 6 w o 22
答案 0 :(得分:2)
对于这种情况,您可以这样做:
g = df.groupby(['c', 'd'])
df['e'] = g.a.transform('sum') + g.b.transform('sum')
df
# outputs
a b c d e
0 1 1 q z 12
1 2 2 q z 12
2 3 3 q z 12
3 4 4 q o 8
4 5 5 w o 22
5 6 6 w o 22
如果您可以通过对同一groupby进行独立变换的线性组合来构造最终结果,则此方法会起作用。
否则,您将使用groupby-apply
,然后合并回原始df。
示例:
_ = df.groupby(['c','d']).apply(lambda x: sum(x.a+x.b)).rename('e').reset_index()
df.merge(_, on=['c','d'])
# same output as above.
答案 1 :(得分:1)
您可以将transform
和sum
两次使用df['e'] = df.groupby(['c', 'd'])[['a', 'b']].transform('sum').sum(1)
print(df)
a b c d e
0 1 1 q z 12
1 2 2 q z 12
2 3 3 q z 12
3 4 4 q o 8
4 5 5 w o 22
5 6 6 w o 22
和using f = typename std::result_of<decltype(&foo<&bar::a>::q)(bar&)>::type;
using q= typename std::result_of<decltype(&qoo<&bar::a>)(bar&)>::type;
:
type