我有一个不平衡的数据集,即unbalanced.df
,看起来如下:
<表类>
日期
ID
城市
状态数量 tbody><<tr>2019 - 01年 10001 洛杉矶 CA 500 2019 - 02年 10001 洛杉矶 CA 995 2019 - 03年10001 洛杉矶 CA 943 2019 - 0110002 休斯顿 TX 4330 2019 - 03年10002 休斯顿 TX 2340 2019 - 0110003 萨克拉门托 CA 235 2019 - 02年 10003 萨克拉门托 CA 239 2019 - 03年10003 萨克拉门托 CA 233 表类>
一个选项,它提供了一个有效的抽象,是完全从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')