我想知道是否有人可以就如何继续下面的内容提出一些建议.作为熊猫的新手,我觉得目前我的整体知识和技能水平还不足以处理我在下面概述的要求.
我有一个pandas数据框,其中包含大约2000个零件编号的列表.对于每个零件,零件的销售年限,月份数量,销售数量和销售价值.每年都有可能偶尔失踪.在下面显示的2007年的示例数据中,由于该月没有销售,因此缺少第11个月.同样地,对于2008年,第11个月和12人失踪.我想要做的是插入每年缺少的月份,并在每个part_id组中插入包含适当年份,月份和零值的行.
总的来说,数据是大约. 60200,大约有行. 2000部分id.
我不介意花时间研究解决方案,但可以用一些指示来帮助我的教育.
index Part_ID Year Month Qty Sales
60182 ZZSSL 2007 5 11.0 724.85
60183 ZZSSL 2007 6 7.0 537.94
60184 ZZSSL 2007 7 17.0 1165.02
60185 ZZSSL 2007 8 3.0 159.56
60186 ZZSSL 2007 9 67.0 4331.28
60187 ZZSSL 2007 10 72.0 4582.98
60188 ZZSSL 2007 12 42.0 2651.42
60189 ZZSSL 2008 1 22.0 1422.32
60190 ZZSSL 2008 2 16.0 1178.98
60191 ZZSSL 2008 3 20.0 1276.60
60192 ZZSSL 2008 4 28.0 2120.84
60193 ZZSSL 2008 5 2.0 83.03
60194 ZZSSL 2008 6 16.0 1250.24
60195 ZZSSL 2008 9 17.0 1323.34
60196 ZZSSL 2008 10 2.0 197.98
60197 ZZSSL 2009 1 21.0 1719.30
60198 ZZSSL 2009 2 1.0 78.15
60199 ZZSSL 2009 3 3.0 281.34
60200 ZZSSL 2009 4 25.0 2214.25
60201 ZZSSL 2009 5 10.0 833.60
60202 ZZSSL 2009 6 1.0 83.36
60203 ZZSSL 2009 7 1.0 83.36
最佳答案
我认为你需要首先0700,然后0700和
reindex
列由MultiIndex从from_product
和stack
创建:
mux = pd.MultiIndex.from_product([['Qty','Sales'],np.arange(1,13)])
print (df.set_index(['Part_ID','Year','Month'])
.unstack(fill_value=0)
.reindex(columns=mux,fill_value=0)
.stack()
.rename_axis(['Part_ID','Month'])
.reset_index())
Part_ID Year Month Qty Sales
0 ZZSSL 2007 1 0.0 0.00
1 ZZSSL 2007 2 0.0 0.00
2 ZZSSL 2007 3 0.0 0.00
3 ZZSSL 2007 4 0.0 0.00
4 ZZSSL 2007 5 11.0 724.85
5 ZZSSL 2007 6 7.0 537.94
6 ZZSSL 2007 7 17.0 1165.02
7 ZZSSL 2007 8 3.0 159.56
8 ZZSSL 2007 9 67.0 4331.28
9 ZZSSL 2007 10 72.0 4582.98
10 ZZSSL 2007 11 0.0 0.00
11 ZZSSL 2007 12 42.0 2651.42
12 ZZSSL 2008 1 22.0 1422.32
13 ZZSSL 2008 2 16.0 1178.98
14 ZZSSL 2008 3 20.0 1276.60
15 ZZSSL 2008 4 28.0 2120.84
16 ZZSSL 2008 5 2.0 83.03
17 ZZSSL 2008 6 16.0 1250.24
18 ZZSSL 2008 7 0.0 0.00
19 ZZSSL 2008 8 0.0 0.00
20 ZZSSL 2008 9 17.0 1323.34
21 ZZSSL 2008 10 2.0 197.98
22 ZZSSL 2008 11 0.0 0.00
23 ZZSSL 2008 12 0.0 0.00
24 ZZSSL 2009 1 21.0 1719.30
25 ZZSSL 2009 2 1.0 78.15
26 ZZSSL 2009 3 3.0 281.34
27 ZZSSL 2009 4 25.0 2214.25
28 ZZSSL 2009 5 10.0 833.60
29 ZZSSL 2009 6 1.0 83.36
30 ZZSSL 2009 7 1.0 83.36
31 ZZSSL 2009 8 0.0 0.00
32 ZZSSL 2009 9 0.0 0.00
33 ZZSSL 2009 10 0.0 0.00
34 ZZSSL 2009 11 0.0 0.00
35 ZZSSL 2009 12 0.0 0.00
如果只需要每年的开始和结束月份之间缺少值:
df['Month'] = pd.to_datetime(df.Month.astype(str) + '-01-'
+ df.Year.astype(str))
df = df.set_index('Month')
.groupby(['Part_ID','Year'])
.resample('MS')
.asfreq()
.fillna(0)
.drop(['Part_ID','Year'],axis=1)
.reset_index()
df['Month'] = df['Month'].dt.month
print (df)
Part_ID Year Month Qty Sales
0 ZZSSL 2007 5 11.0 724.85
1 ZZSSL 2007 6 7.0 537.94
2 ZZSSL 2007 7 17.0 1165.02
3 ZZSSL 2007 8 3.0 159.56
4 ZZSSL 2007 9 67.0 4331.28
5 ZZSSL 2007 10 72.0 4582.98
6 ZZSSL 2007 11 0.0 0.00
7 ZZSSL 2007 12 42.0 2651.42
8 ZZSSL 2008 1 22.0 1422.32
9 ZZSSL 2008 2 16.0 1178.98
10 ZZSSL 2008 3 20.0 1276.60
11 ZZSSL 2008 4 28.0 2120.84
12 ZZSSL 2008 5 2.0 83.03
13 ZZSSL 2008 6 16.0 1250.24
14 ZZSSL 2008 7 0.0 0.00
15 ZZSSL 2008 8 0.0 0.00
16 ZZSSL 2008 9 17.0 1323.34
17 ZZSSL 2008 10 2.0 197.98
18 ZZSSL 2009 1 21.0 1719.30
19 ZZSSL 2009 2 1.0 78.15
20 ZZSSL 2009 3 3.0 281.34
21 ZZSSL 2009 4 25.0 2214.25
22 ZZSSL 2009 5 10.0 833.60
23 ZZSSL 2009 6 1.0 83.36
24 ZZSSL 2009 7 1.0 83.36