Как выполнить операцию над подгруппой фрейма данных в pandas? - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь рассчитать процентное изменение для определенных c подмножеств фрейма данных на основе номера их недели. Фрейм данных выглядит следующим образом:

      ref_dt   week_name  county_name  state_name   county_fips_code    cmi
0   2020-01-01  2020-W01   Broward      Florida         12011         3.651278
1   2020-01-02  2020-W01.  Broward      Florida         12011         3.851842
2   2020-01-03  2020-W01.  Broward      Florida         12011         3.868523
3   2020-01-04  2020-W01.  Broward      Florida         12011         3.748446
4   2020-01-05  2020-W01.  Broward      Florida         12011         3.650769
5   2020-01-06  2020-W02.  Broward      Florida         12011         3.878860
6   2020-01-07  2020-W02.  Broward      Florida         12011         3.899171
7   2020-01-08  2020-W02.  Broward      Florida         12011         3.907816
8   2020-01-09  2020-W02.  Broward      Florida         12011         3.913623
9   2020-01-10  2020-W02.  Broward      Florida         12011         3.919010

Он содержит информацию для каждого округа (здесь показаны только подмножества с примером Броварда) в штате Флорида и индекс мобильности, рассчитанный в столбце cmi. Процентное изменение рассчитывается путем сравнения движения за день недели (ref_dt) со средним значением за те же дни недели. Вот пример для week1 и Broward после поднабора, который я сделал в pandas.

df = counties[counties['county_name']=='Broward']
week1 = df[df['week_name'] == '2020-W01']
cmi_mean = week1['cmi'].mean()
week1['percent_change'] = week1['cmi']/cmi_mean * 100

Окончательный вывод CSV будет выглядеть примерно так (я отбросил код состояния и county_fips_code):

      ref_dt    week_name  county_name    cmi      percent_change
0   2020-01-01  2020-W01     Broward    3.651278    97.259216
1   2020-01-02  2020-W01     Broward    3.851842    102.601642
2   2020-01-03  2020-W01     Broward    3.868523    103.045989
3   2020-01-04  2020-W01     Broward    3.748446    99.847497
4   2020-01-05  2020-W01     Broward    3.650769    97.245656

Я хочу применять один и тот же лог c для каждой недели (от 1 до 14), для каждого округа. Каков был бы лучший способ сделать это? мне нужно изменить форму моего фрейма данных, используя сводную или стековую структуру и сделать столбцы для каждой недели, основываясь на их имени_недели, или я могу рассчитать процентное изменение с текущей структурой моего фрейма данных?

Примечание: каждое среднее значение должно быть рассчитано для каждой недели.

1 Ответ

0 голосов
/ 07 апреля 2020

Используйте df.groupby с transform и пусть pandas обрабатывает выравнивание вычислений с использованием индексов:

df['percent_change'] = df['cmi'] / df.groupby(['county_name', 'week_name'])['cmi'].transform('mean') * 100

Вывод:

       ref_dt  week_name county_name state_name  county_fips_code       cmi  percent_change
0  2020-01-01  2020-W01.     Broward    Florida             12011  3.651278       97.259220
1  2020-01-02  2020-W01.     Broward    Florida             12011  3.851842      102.601650
2  2020-01-03  2020-W01.     Broward    Florida             12011  3.868523      103.045982
3  2020-01-04  2020-W01.     Broward    Florida             12011  3.748446       99.847487
4  2020-01-05  2020-W01.     Broward    Florida             12011  3.650769       97.245661
5  2020-01-06  2020-W02.     Broward    Florida             12011  3.878860       99.363782
6  2020-01-07  2020-W02.     Broward    Florida             12011  3.899171       99.884084
7  2020-01-08  2020-W02.     Broward    Florida             12011  3.907816      100.105541
8  2020-01-09  2020-W02.     Broward    Florida             12011  3.913623      100.254297
9  2020-01-10  2020-W02.     Broward    Florida             12011  3.919010      100.392295
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...