pivot_table索引中的NaN值导致数据丢失[英] NaN values in pivot_table index causes loss of data

本文是小编为大家收集整理的关于pivot_table索引中的NaN值导致数据丢失的处理方法,想解了pivot_table索引中的NaN值导致数据丢失的问题怎么解决?pivot_table索引中的NaN值导致数据丢失问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

这是一个简单的数据框:

> df = pd.DataFrame({'a': ['a1', 'a2', 'a3'],
                     'b': ['optional1', None, 'optional3'],
                     'c': ['c1', 'c2', 'c3'],
                     'd': [1, 2, 3]})
> df

    a          b   c  d
0  a1  optional1  c1  1
1  a2       None  c2  2
2  a3  optional3  c3  3

枢轴方法1

数据可以枢纽:

> df.pivot_table(index=['a','b'], columns='c')
                d     
c              c1   c3
a  b                  
a1 optional1  1.0  NaN
a3 optional3  NaN  3.0

下行:第二行中的数据丢失了,因为df['b'][1] == None.

枢轴方法2

> df.pivot_table(index=['a'], columns='c')
      d          
c    c1   c2   c3
a                
a1  1.0  NaN  NaN
a2  NaN  2.0  NaN
a3  NaN  NaN  3.0

下行:列b丢失了.

如何将两种方法组合在一起,以使列b和第二行保持如此:

                d     
c              c1   c2   c3
a  b                  
a1 optional1  1.0  NaN  NaN
a2      None  NaN  2.0  NaN
a3 optional3  NaN  NaN  3.0

更普遍地:如果键具有NaN值,则如何保留一排的信息?

推荐答案

使用set_index和unstack执行枢轴:

df = df.set_index(['a', 'b', 'c']).unstack('c')

这本质上是潘达做的https://github.com/pandas-dev/pandas/pandas/blob/master/master/pandas/pandas/core/reshape.py-pypy一下引擎盖用于pivot. stack和unstack方法与pivot密切相关,通常可用于执行类似枢轴的操作,这些操作与内置的枢轴函数不完全符合.

结果输出:

                d          
c              c1   c2   c3
a  b                       
a1 optional1  1.0  NaN  NaN
a2 NaN        NaN  2.0  NaN
a3 optional3  NaN  NaN  3.0

其他推荐答案

您可以使用fillna替换None条目:

df['b'] = df['b'].fillna('foo')
df.pivot_table(index=['a','b'], columns=['c'])
----
                    d          
c              c1   c2   c3
a  b                       
a1 optional1  1.0  NaN  NaN
a2 foo        NaN  2.0  NaN
a3 optional3  NaN  NaN  3.0

其他推荐答案

使用此:

def pivot_table(df, index, columns, values):
    df = df[index + columns + values]
    i  = len(index)
    df = df.set_index(index+columns).unstack(columns).reset_index()
    df.columns = df.columns.droplevel(1)[:i].append(df.columns.droplevel(0)[i:])
    return df

pivot_table(df, index =['a', 'b'], columns= ['c'], values= ['d'])

本文地址:https://www.itbaoku.cn/post/1728111.html