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