【问题标题】:Pandas - Handle NaN in Pivot Table with Categorical [duplicate]Pandas - 使用分类处理数据透视表中的 NaN [重复]
【发布时间】:2018-07-12 14:43:29
【问题描述】:

我正在使用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

【问题讨论】:

  • 你试过fillna单独列吗?
  • @SuperStew 我没有,但这可能是诀窍。我猜df.fillna(0) 会尝试填充整个数据框,而不仅仅是SalesQuantity
  • df[['Sales','Quantity']].fillna(0)。您只需指明列

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    也许您应该尝试在最终输出中使用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
    

    【讨论】:

    • 我仍然无法让它工作。你的Categorycategorical dtype 吗?
    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多