Группировка и суммирование по нескольким столбцам данных в Pandas

1

У меня есть 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 рядом друг с другом вместо суммирования.

Может ли кто-нибудь помочь в выполнении этой операции?

Теги:
pandas
dataframe
python-3.x

2 ответа

2
Лучший ответ

Запустите 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
  • 0
    Это не соответствует желаемому набору результатов.
0

Создайте столбец группы, используя 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню