【问题标题】:Add missing rows for groups in pandas为 pandas 中的组添加缺失的行
【发布时间】:2020-12-25 19:12:50
【问题描述】:

我有一个包含countryyearvalue 列的数据。最大值(年)是 1985 年,最小值(年)是 2016 年,但并非所有国家都有全年(1985-2016 年)的数据。因此,为了在国家之间绘制可比较的条形图,我想为每个国家/地区添加 value 0 来表示缺失的年份。

例如:

df -->
    country year    value
0   India   2040    354
1   India   2041    357
2   India   2042    454
3   USA     2040    454
4   USA     2041    436

由于美国没有 2042 数据,因此将其添加到:

    country year    value
0   India   2040    354
1   India   2041    357
2   India   2042    454
3   USA     2040    454
4   USA     2041    436
5   USA     2042    0 

如何为我的数据中的每个国家/地区执行此操作?

【问题讨论】:

  • 我不确定我是否理解这个问题。据我所知,max(year) 是 2042。我错过了什么吗?

标签: python pandas dataframe


【解决方案1】:

我们可以将“年份”转换为分类列,然后让 pandas GroupBy 完成繁重的工作:

df['year'] = pd.Categorical(df['year'], categories=df['year'].unique())
df.groupby(['country','year'], as_index=False).first()

  country  year  value
0   India  2040  354.0
1   India  2041  357.0
2   India  2042  454.0
3     USA  2040  454.0
4     USA  2041  436.0
5     USA  2042    NaN

另一个想法是重新索引:

mux = pd.MultiIndex.from_product([df['country'].unique(), df['year'].unique()])

(df.set_index(['country', 'year'])
   .reindex(mux)
   .reset_index()
   .set_axis(df.columns, axis=1))

  country  year  value
0   India  2040  354.0
1   India  2041  357.0
2   India  2042  454.0
3     USA  2040  454.0
4     USA  2041  436.0
5     USA  2042    NaN

重要警告:这些解决方案都不能很好地处理重复行。您需要通过添加唯一标识列(可能使用GroupBy.cumcount)来对行进行重复数据删除。

【讨论】:

    【解决方案2】:

    让我们试试pivot 然后stack

    out = df.pivot(*df).stack(dropna=False).reset_index(name='value')
      country  year  value
    0   India  2040  354.0
    1   India  2041  357.0
    2   India  2042  454.0
    3     USA  2040  454.0
    4     USA  2041  436.0
    5     USA  2042    NaN
    

    【讨论】:

      【解决方案3】:

      pyjanitor 中的 complete 函数可以帮助处理缺失的行;它也可以处理重复:

      #pip install pyjanitor
      import pandas as pd
      import janitor
      df.complete('country', 'year').fillna(0, downcast='infer')
       
        country  year  value
      0   India  2040    354
      1   India  2041    357
      2   India  2042    454
      3     USA  2040    454
      4     USA  2041    436
      5     USA  2042      0
      

      【讨论】:

        猜你喜欢
        • 2022-11-25
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        • 2013-05-20
        • 2021-12-29
        • 1970-01-01
        相关资源
        最近更新 更多