У меня есть dataframe, который выглядит так:
YEAR | REGION | POWER |
2009 | West | 1.66 |
2009 | West | 1.77 |
2009 | East | 10.6 |
2009 | East | 8.7 |
2010 | West | 11.9 |
2010 | North | 14.8 |
2010 | North | 4.6 |
2010 | West | 3.0 |
2011 | East | 7.0 |
2011 | East | 9.66 |
Я хочу суммировать численные значения POWER, сгруппированные как с YEAR, так и с REGION, чтобы получить что-то вроде:
YEAR | REGION | POWER |
2009 | West | 3.43 |
2009 | East | 19.3 |
2010 | West | 11.9 |
2010 | North | 19.4 |
2010 | West | 3.0 |
2011 | East | 16.66 |
Я пробовал:
df.groupby(['YEAR', 'REGION'])['POWER'].sum()
Но я получаю серию со значениями в POWER рядом друг с другом вместо суммирования.
Может ли кто-нибудь помочь в выполнении этой операции?
Запустите sum
в groupby
, а затем reset_index()
чтобы сгладить ее. Вот так:
df.groupby(['YEAR', 'REGION']).sum().reset_index()
# YEAR REGION POWER
# 0 2009 East 19.30
# 1 2009 West 3.43
# 2 2010 North 19.40
# 3 2010 West 14.90
# 4 2011 East 16.66
Создайте столбец группы, используя shift
и cumsum
:
df['grp'] = df.groupby(['YEAR'])['REGION'].apply(lambda x: (x != x.shift(1).bfill()).cumsum())
df_out = df.groupby(['YEAR','REGION','grp'], sort=False).sum().reset_index()
df_out = df_out.drop('grp', axis=1)
Выход:
YEAR REGION POWER
0 2009 West 3.43
1 2009 East 19.30
2 2010 West 11.90
3 2010 North 19.40
4 2010 West 3.00
5 2011 East 16.66
Подробнее об этом, как выглядит столбец группы, grp перед агрегацией. Для каждого года проверяйте регион на область предыдущих записей, если разное приращение на 1. Затем, cumsum в этом году создайте группы.
YEAR REGION POWER grp
0 2009 West 1.66 0
1 2009 West 1.77 0
2 2009 East 10.60 1
3 2009 East 8.70 1
4 2010 West 11.90 0
5 2010 North 14.80 1
6 2010 North 4.60 1
7 2010 West 3.00 2
8 2011 East 7.00 0
9 2011 East 9.66 0