【问题标题】:How to add missing years in panel dataset? [duplicate]如何在面板数据集中添加缺失的年份? [复制]
【发布时间】:2022-02-17 02:42:14
【问题描述】:

我的玩具DataFrame类似于

import pandas as pd

data = {'year': [1999, 2000, 2001, 2002, 2003, 2004, 2005, 
                 1999, 2000, 2003, 2004, 2005],
        'id': [1, 1, 1, 1, 1, 1, 1, 2, 2,  2, 2, 2],
        'price': [1200, 150, 300, 450, 200, 300, 400, 120, 
                  140, 150, 155, 156]
        }

df = pd.DataFrame(data)

添加缺失年份最优雅的方法是什么? 在示例中,由于缺少数据,id = 2 缺少 2001 年和 2002 年。在这种情况下,我仍然希望 DataFrame 中有年份,id 应该是 2 和 price = NaN

我的真实 DataFrame 有数千个 ID。

【问题讨论】:

  • 根据你的数据,你可以试试df.pivot('id', 'year', 'price').stack(dropna=False).rename('price').reset_index()

标签: python pandas dataframe


【解决方案1】:

使用交叉merge 创建“Year”和“ID”的所有可能组合,并将merge 返回到原始DataFrame:

>>> df["year"].drop_duplicates().to_frame().merge(df["id"].drop_duplicates(), how="cross").merge(df, how="left")
    year  id   price
0   1999   1  1200.0
1   1999   2   120.0
2   2000   1   150.0
3   2000   2   140.0
4   2001   1   300.0
5   2001   2     NaN
6   2002   1   450.0
7   2002   2     NaN
8   2003   1   200.0
9   2003   2   150.0
10  2004   1   300.0
11  2004   2   155.0
12  2005   1   400.0
13  2005   2   156.0

【讨论】:

    【解决方案2】:

    您可以将“年份”设为分类变量并将其包含在 groupby 中:

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

    输出:

        id  year   price
    0    1  1999  1200.0
    1    1  2000   150.0
    2    1  2001   300.0
    3    1  2002   450.0
    4    1  2003   200.0
    5    1  2004   300.0
    6    1  2005   400.0
    7    2  1999   120.0
    8    2  2000   140.0
    9    2  2001     NaN
    10   2  2002     NaN
    11   2  2003   150.0
    12   2  2004   155.0
    13   2  2005   156.0
    

    【讨论】:

      【解决方案3】:

      更新 你也可以从itertools使用product

      # from itertools import product
      
      >>> df.set_index(['year', 'id']).reindex(product(set(df['year']), set(df['id']))) \
            .sort_index(level=1).reset_index()
      
          year  id   price
      0   1999   1  1200.0
      1   2000   1   150.0
      2   2001   1   300.0
      3   2002   1   450.0
      4   2003   1   200.0
      5   2004   1   300.0
      6   2005   1   400.0
      7   1999   2   120.0
      8   2000   2   140.0
      9   2001   2     NaN
      10  2002   2     NaN
      11  2003   2   150.0
      12  2004   2   155.0
      13  2005   2   156.0
      

      yearid 列的所有组合创建一个MultiIndex。将此列设置为索引并通过多索引重新索引:

      mi = pd.MultiIndex.from_product([df['year'].unique(), df['id'].unique()], names=['year', 'id'])
      
      out = df.set_index(['year', 'id']).reindex(mi).reset_index().sort_values('id', ignore_index=True)
      

      输出:

      >>> out
          year  id   price
      0   1999   1  1200.0
      1   2000   1   150.0
      2   2001   1   300.0
      3   2002   1   450.0
      4   2003   1   200.0
      5   2004   1   300.0
      6   2005   1   400.0
      7   1999   2   120.0
      8   2000   2   140.0
      9   2001   2     NaN
      10  2002   2     NaN
      11  2003   2   150.0
      12  2004   2   155.0
      13  2005   2   156.0
      

      【讨论】:

        猜你喜欢
        • 2017-10-04
        • 2021-07-20
        • 1970-01-01
        • 2022-12-29
        • 2020-12-06
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多