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



我有一个不平衡的数据集,即unbalanced.df,看起来如下:

<表类> 日期 ID 城市 状态数量tbody><<tr>2019 - 01年10001洛杉矶CA5002019 - 02年10001洛杉矶CA9952019 - 03年10001洛杉矶CA9432019 - 0110002休斯顿TX43302019 - 03年10002休斯顿TX23402019 - 0110003萨克拉门托CA2352019 - 02年10003萨克拉门托CA2392019 - 03年10003萨克拉门托CA233

一个选项,它提供了一个有效的抽象,是完全从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

尝试使用multiIndexes和reindex:

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')

最新更新