Я хотел бы создать новый dataframe из результатов groupby
на другом. Результат должен иметь одну строку на группу (в основном, векторный снимок карты), а новые имена столбцов не имеют никакого отношения к существующим именам. Это кажется естественным использованием для agg
, но, похоже, это создает существующие столбцы.Создайте совершенно новый DataFrame эффективно из groupby .agg() или .apply() в Pandas?
d = pd.DataFrame({'a': [0,0,1,1], 'b': [3,4,5,6], 'c': [7,8,9,0]})
a b c
0 0 3 7
1 0 4 8
2 1 5 9
3 1 6 0
agg()
создаст новые столбцы с Серия:
d.groupby('a')['b'].agg({'x': lambda g: g.sum()})
x
a
0 7
1 11
Но удручающе не с DataFrame:
d.groupby('a').agg({'x': lambda g: g.b.sum()})
KeyError: 'x'
я могу это сделать, возвращая один двухрядный DataFrame из apply()
:
d.groupby('a').apply(lambda g: pd.DataFrame([{'x': g.b.mean(), 'y': (g.b * g.c).sum()}])).reset_index(level=1, drop=True)
x y
a
0 3.5 53
1 5.5 45
, но это некрасиво и, как вы можете себе представить, создание нового dict, list и DataFrame для каждой строки медленнее даже для входов с небольшим размером.
Может быть, ответ парфе здесь также будет работать для вас: http://stackoverflow.com/questions/35938393/pandas-aggregating-multiple-columns-with-multiple-functions/35944697#35944697 – JohnE