如何通过添加没有信息的缺失行来平衡面板数据?

How to balance panel data by adding missing rows with no information?

我有一个不平衡的数据集,即 unbalanced.df,如下所示:

Date ID City State Quantity
2019-01 10001 Los Angeles CA 500
2019-02 10001 Los Angeles CA 995
2019-03 10001 Los Angeles CA 943
2019-01 10002 Houston TX 4330
2019-03 10002 Houston TX 2340
2019-01 10003 Sacramento CA 235
2019-02 10003 Sacramento CA 239
2019-03 10003 Sacramento CA 233

如您所见,休斯顿没有 2019-02 作为日期。这发生在我与不同城市的面板数据中。

我想通过在缺失日期添加 NA 行使此面板对称,这样新的面板数据看起来像这样,balanced.df:

Date ID City State Quantity
2019-01 10001 Los Angeles CA 500
2019-02 10001 Los Angeles CA 995
2019-03 10001 Los Angeles CA 943
2019-01 10002 Houston TX 4330
2019-02 10002 Houston TX NaN
2019-03 10002 Houston TX 2340
2019 -01 10003 Sacramento CA 235
2019-02 10003 Sacramento CA 239
2019-03 10003 Sacramento CA 233

在这种情况下,我有绝对最小日期和绝对最大日期,所以我想确保所有城市都遵循相同的日期。我怎样才能用城市的 NaN 行填充我的面板,从而使每个 ID、城市和州的行数相同?

尝试使用 multiIndexes 和重新索引:

mapp = df.set_index('ID')[['City', 'State']].drop_duplicates()
df1 = df.set_index(['Date', 'ID'])\
        .reindex(pd.MultiIndex.from_product([df['Date'].unique(),
                                             df['ID'].unique()], 
                                            names=['Date', 'ID']))\
        .reset_index()
df1.assign(City=df1['ID'].map(mapp['City']), State=df1['ID'].map(mapp['State']))

输出:

      Date     ID         City State  Quantity
0  2019-01  10001  Los Angeles    CA     500.0
1  2019-01  10002      Houston    TX    4330.0
2  2019-01  10003   Sacramento    CA     235.0
3  2019-02  10001  Los Angeles    CA     995.0
4  2019-02  10002      Houston    TX       NaN
5  2019-02  10003   Sacramento    CA     239.0
6  2019-03  10001  Los Angeles    CA     943.0
7  2019-03  10002      Houston    TX    2340.0
8  2019-03  10003   Sacramento    CA     233.0

如果你有很多列,那么你可以使用 merge 而不是 assign:

df[['ID', 'City', 'State']].drop_duplicates().merge(df1[['ID', 'Quantity']], on='ID')

一个提供有效抽象的选项是使用 complete from pyjanitor 来获取 Date('ID', 'City', 'State'):

组合的缺失行
# pip install pyjanitor
import pandas as pd
import janitor

df.complete(('ID', 'City', 'State'), 'Date')

      Date     ID         City State  Quantity
0  2019-01  10001  Los Angeles    CA     500.0
1  2019-02  10001  Los Angeles    CA     995.0
2  2019-03  10001  Los Angeles    CA     943.0
3  2019-01  10002      Houston    TX    4330.0
4  2019-02  10002      Houston    TX       NaN
5  2019-03  10002      Houston    TX    2340.0
6  2019-01  10003   Sacramento    CA     235.0
7  2019-02  10003   Sacramento    CA     239.0
8  2019-03  10003   Sacramento    CA     233.0