如何通过添加没有信息的缺失行来平衡面板数据?
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
我有一个不平衡的数据集,即 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