Pandas-在分类表中处理NaN

时间:2018-07-12 14:43:29

标签: python pandas pivot-table categorical-data fillna

我正在使用Categorical dtype创建多个数据透视表,然后将它们合并到一个大的数据透视表/数据框中。

但是,在某些情况下,执行合并时会得到NaN,而当我尝试进行fillna(0)时,会出现以下错误:ValueError: fill value must be in categories

pv1 = pd.PivotTable(df, index='Category', values='Sales', aggfunc='sum')    
pv2 = pd.PivotTable(df, index='Category', values='Quantity', aggfunc='sum')    
chart = pv1.merge(pv2, on='Category', how='outer').fillna(0)

实际输出:

 Category   Sales  Quantity
 Boxes      100    NaN
 Staples    20     10
 Paper      NaN    20

所需的输出:

 Category   Sales  Quantity
 Boxes      100    0
 Staples    20     10
 Paper      0      20

2 个答案:

答案 0 :(得分:0)

也许您应该尝试在最终输出中使用fillna而不是中间步骤。效果很好:

In [120]: df
Out[120]: 
  Category  Sales  Quantity
0    Boxes  100.0       NaN
1  Staples   20.0      10.0
2    Paper    NaN      20.0

In [122]: df.fillna(0, inplace=True)

In [123]: df
Out[123]: 
  Category  Sales  Quantity
0    Boxes  100.0       0.0
1  Staples   20.0      10.0
2    Paper    0.0      20.0

答案 1 :(得分:0)

最简单的方法是定义要在其上进行fillna()的列,然后仅在这些列上执行(基本上排除categorical列。

fill_cols = ['Sales','Quantity'] df[fill_cols] = df[fill_cols].fillna(0)