熊猫:在ivot_table中,如何自定义填充缺失值?

时间:2019-02-05 02:55:11

标签: python pandas

我想用索引中的值填充熊猫数据透视表中的缺失值,并填充缺失的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] }

2 个答案:

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

然后,像往常一样旋转,然后在水平轴上旋转ffillbfill

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_indexfillna是一种选择:

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时,它将从左向右转发填充。