我想用索引中的值填充熊猫数据透视表中的缺失值,并填充缺失的Year Week列。
import pandas as pd
d = { 'Year': [2019,2019,2019,2019,2019,2019],
'Week': [1,2,3,4,5,6],
'Part': ['A','A','A','B','B','B'],
'Static': [20,20,20,40,40,40],
'Value': [np.nan,10,50,np.nan,30,np.nan]
}
df = pd.DataFrame(d)
pivot = df.pivot_table(index=['Part','Static'], columns=['Year', 'Week'], values=['Value'])
print(pivot)
Value
Year 2019
Week 2 3 5
Part Static
A 20 10.0 50.0 NaN
B 40 NaN NaN 30.0
在上面的示例中,缺少第1、4和6周,因为它们没有值。至于NaN
,我想用“左边”的值填充它们,因此对于第1周,A部分的值将是20.0,第4周到6周的值将是50.0,对于第1周的值将是50.0。 B部分的所有NaN
都将填充左侧的值。
预期输出为
Value
Year 2019
Week 1 2 3 4 5 6
Part Static
A 20 20.0 10.0 50.0 50.0 50.0 50.0
B 40 40.0 40.0 40.0 40.0 30.0 30.0
PS:我可以参考参考日历数据框来提取“年周”的所有值。
编辑:
我在数据上测试了解决方案,但似乎不起作用。这是已删除第4周的更新数据。
d = { 'Year': [2019,2019,2019,2019,2019],
'Week': [1,2,3,5,6],
'Part': ['A','A','A','B','B'],
'Static': [20,20,20,40,40],
'Value': [np.nan,10,50,30,np.nan]
}
df = pd.DataFrame(d)
#Year Week data set for reference
d2 = {'Year':[2019,2019,2019,2019,2019,2019,2019,2019,2019,2019],
'Week':[1,2,3,4,5,6,7,8,9,10] }
答案 0 :(得分:1)
填充列Value
,首先填充列,然后用Static
值填充
df.Value = df.groupby('Part')[['Static', 'Value']].ffill().ffill(axis=1).Value
此操作后,Value
列的类型为object
。因此,必须将其强制转换为int
。
df.Value = df.Value.astype('int')
然后,像往常一样旋转,然后在水平轴上旋转ffill
和bfill
df.pivot_table(index=['Part','Static'], columns=['Year', 'Week'], values=['Value']).ffill(axis=1).bfill(axis=1)
# outputs:
Value
Year 2019
Week 1 2 3 4 5 6
Part Static
A 20 20.0 10.0 50.0 50.0 50.0 50.0
B 40 40.0 40.0 40.0 40.0 30.0 30.0
答案 1 :(得分:1)
unstack
reset_index
和fillna
是一种选择:
df.set_index(['Year','Week', 'Part', 'Static']).unstack([0,1]).reset_index().fillna(method='ffill', axis=1)
Part Static Value
Year 2019
Week 1 2 3 4 5 6
0 A 20 20 10 50 50 50 50
1 B 40 40 40 40 40 30 30
带有fillna
的 methond='ffill'
将转发填充数据,因此当您设置axis=1
时,它将从左向右转发填充。