数据透视表索引中的 NaN 值导致数据丢失

vic*_*tor 7 python pivot dataframe pandas

这是一个简单的数据帧:

> 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
Run Code Online (Sandbox Code Playgroud)

枢轴方法 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
Run Code Online (Sandbox Code Playgroud)

缺点:第 2 行中的数据丢失,因为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
Run Code Online (Sandbox Code Playgroud)

缺点:色谱柱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
Run Code Online (Sandbox Code Playgroud)

更一般地:如果键有NaN值,如何在透视期间保留行中的信息?

roo*_*oot 5

使用set_indexunstack执行旋转:

df = df.set_index(['a', 'b', 'c']).unstack('c')
Run Code Online (Sandbox Code Playgroud)

这本质上就是 pandas在幕后所做的事情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
Run Code Online (Sandbox Code Playgroud)