【问题标题】:python pandas: pivot_table silently drops indices with nanspython pandas:pivot_table 用 nans 静默删除索引
【发布时间】:2021-07-27 21:22:49
【问题描述】:

是否可以选择不删除包含NaN 的索引?我认为默默地从枢轴中删除这些行会在某些时候给某人带来严重的痛苦。

import pandas
import numpy

a = [['a', 'b', 12, 12, 12], ['a', numpy.nan, 12.3, 233., 12], ['b', 'a', 123.23, 123, 1], ['a', 'b', 1, 1, 1.]]

df = pandas.DataFrame(a, columns=['a', 'b', 'c', 'd', 'e'])

df_pivot = df.pivot_table(index=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum)
print(df)
print(df_pivot)

输出:

   a    b       c    d   e
0  a    b   12.00   12  12
1  a  NaN   12.30  233  12
2  b    a  123.23  123   1
3  a    b    1.00    1   1
          c    d   e
a b                 
a b   13.00   13  13
b a  123.23  123   1

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    目前不支持此功能,请参阅此问题以获得增强功能:https://github.com/pydata/pandas/issues/3729

    使用虚拟、枢轴和替换填充索引的解决方法

    In [28]: df = df.reset_index()
    
    In [29]: df['b'] = df['b'].fillna('dummy')
    
    In [30]: df['dummy'] = np.nan
    
    In [31]: df
    Out[31]: 
       a      b       c    d   e  dummy
    0  a      b   12.00   12  12    NaN
    1  a  dummy   12.30  233  12    NaN
    2  b      a  123.23  123   1    NaN
    3  a      b    1.00    1   1    NaN
    
    In [32]: df.pivot_table(index=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum)
    Out[32]: 
                  c    d   e
    a b                     
    a b       13.00   13  13
      dummy   12.30  233  12
    b a      123.23  123   1
    
    In [33]: df.pivot_table(index=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum).reset_index().replace('dummy',np.nan).set_index(['a','b'])
    Out[33]: 
                c    d   e
    a b                   
    a b     13.00   13  13
      NaN   12.30  233  12
    b a    123.23  123   1
    

    【讨论】:

    • 当索引中有 nan 值时,也许有人可以注入警告消息?我不认为它真的需要“支持”。手动填充没问题,你只需要知道它需要完成。
    • 问题是这是一个“功能”,因为当你分组并有一个 NaN 时,它被排除在外;我想你可以有一个控制这个的选项(默认情况下是假的);和/或加注
    • 我同意,但我无法想象警告会破坏任何人对该功能的看法。您甚至可以在 pivot_table 中有一个标志来不打印警告。我只是担心安全。
    【解决方案2】:

    目前,pivot_table 支持选项“dropna=False”:

    df.pivot_table(rows=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum, dropna=False)

    【讨论】:

    • 我试过了,但它不起作用。用熊猫 1.3.0 测试。这不适用于索引。但它适用于列,即如果值中的字段之一(对于您的情况为 c、d、e)包含所有 NaN 值
    • 用 1.4.0 试过,但不能在索引中使用 nan
    猜你喜欢
    • 2016-03-03
    • 2016-01-30
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2016-05-10
    • 2014-05-31
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多