[英]Incremental group by from a specific year onwards in Pandas
我有一個看起來像這樣的數據框:
df_dict = {'country': ['Japan','Japan','Japan','Japan','Japan','Japan','Japan', 'Greece','Greece','Greece','Greece','Greece','Greece','Greece'],
'year': [1970, 1982, 1999, 2014, 2017, 2018, 2021,1981, 1987, 2002, 2015, 2018, 2019, 2021],
'value': [320, 416, 172, 652, 390, 570, 803, 144, 273, 129, 477, 831, 664,117]}
df = pd.DataFrame(df_dict)
country year value
0 Japan 1970 320
1 Japan 1982 416
2 Japan 1999 172
3 Japan 2014 652
4 Japan 2017 390
5 Japan 2018 570
6 Japan 2021 803
7 Greece 1981 144
8 Greece 1987 273
9 Greece 2002 129
10 Greece 2015 477
11 Greece 2018 831
12 Greece 2019 664
13 Greece 2021 117
我試圖從2014
年開始按年份對數據進行分組,但我似乎無法使用groupby(['country','year'])['value']
實際上,我想總結每個country
year
大於或等於2014
的值。 所以我的預期輸出應該是這個樣子:
country year value
0 Japan 2014 1560
1 Japan 2015 1560
2 Japan 2016 1560
3 Japan 2017 1950
4 Japan 2018 2520
5 Japan 2019 2520
6 Japan 2020 2520
7 Japan 2021 3323
8 Greece 2014 546
9 Greece 2015 1023
10 Greece 2016 1023
11 Greece 2017 1023
12 Greece 2018 1854
13 Greece 2019 2518
14 Greece 2020 2518
15 Greece 2021 2635
Japan
在2014
的值是year <= 2014
的所有先前值的總和, 2015
Japan
的值是year <= 2014
的所有先前值的總和,依此類推。 我想總結的最后一年是數據框中所有國家/地區的2021
。
首先通過MultiIndex.from_product
創建MultiIndex
,然后通過Series.clip
和 aggregate sum
轉換像2014
年這樣低的年份,通過GroupBy.cumsum
添加缺失的年份,並通過Series.reindex
使用每個國家的累計和:
mux = pd.MultiIndex.from_product([df['country'].unique(), range(2014, df['year'].max()+1)],
names=['country','year'])
df = (df.groupby(['country',df['year'].clip(lower=2014)])['value']
.sum()
.reindex(mux, fill_value=0)
.groupby(level=0)
.cumsum()
.reset_index())
print (df)
country year value
0 Japan 2014 1560
1 Japan 2015 1560
2 Japan 2016 1560
3 Japan 2017 1950
4 Japan 2018 2520
5 Japan 2019 2520
6 Japan 2020 2520
7 Japan 2021 3323
8 Greece 2014 546
9 Greece 2015 1023
10 Greece 2016 1023
11 Greece 2017 1023
12 Greece 2018 1854
13 Greece 2019 2518
14 Greece 2020 2518
15 Greece 2021 2635
如果您不介意創建新的數據框,可以考慮使用下面的代碼作為替代方案。
遍歷國家和年份列表,並針對每個組合,計算截至並包括該年份的 value 列的累計總和。 您可以通過過濾數據框以僅包含當前國家和年份 <= 當前年份的行,然后應用cumsum()
方法來執行此操作。 最后,將結果行附加到空數據框。
years = list(range(2014, 2022))
countries = df['country'].unique()
result_df = pd.DataFrame(columns=['country', 'year', 'value'])
for country in countries:
for year in years:
df_filtered = df[(df['country'] == country) & (df['year'] <= year)]
cumulative_sum = df_filtered['value'].cumsum().iloc[-1]
result_df = pd.concat([result_df, pd.DataFrame({'country': country, 'year': year, 'value': cumulative_sum}, index=[0])], ignore_index=True)
輸出:
> result_df country year value 0 Japan 2014 1560 1 Japan 2015 1560 2 Japan 2016 1560 3 Japan 2017 1950 4 Japan 2018 2520 5 Japan 2019 2520 6 Japan 2020 2520 7 Japan 2021 3323 8 Greece 2014 546 9 Greece 2015 1023 10 Greece 2016 1023 11 Greece 2017 1023 12 Greece 2018 1854 13 Greece 2019 2518 14 Greece 2020 2518 15 Greece 2021 2635
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.