簡體   English   中英

從 Pandas 的特定年份開始增量分組

[英]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

Japan2014的值是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM