从DataFrame中删除NaN并从多索引

时间:2017-08-19 14:52:31

标签: python pandas

给定一个多索引DataFrame:

                 col_A  col_B
level_0 level_1              
A       x          1.0    NaN
        y          NaN    1.0
        x          NaN    2.0
        y          2.0    NaN

如何从df中删除NaN并从多索引中复制以获取:

                 col_A  col_B
level_0 level_1              
A       x          1.0    2.0
        y          2.0    1.0

这是MWE:

import pandas as pd
import numpy as np

index = pd.MultiIndex.from_product([['A', 'A'],
                                  ['x', 'y']],
                                 names=['level_0',
                                        'level_1'])
data =[
    [1, np.NaN],
    [np.NaN, 1],
    [np.NaN,2],
    [2, np.NaN],
]
df = pd.DataFrame(data=data, index=index, columns=['col_A', 'col_B'])
print df

4 个答案:

答案 0 :(得分:3)

您可以将sumlevel参数一起使用:

df.sum(level=[0,1])

或@JohnGalt建议:

df.sum(level=df.index.names)

输出:

                 col_A  col_B
level_0 level_1              
A       x          1.0    2.0
        y          2.0    1.0

答案 1 :(得分:2)

尝试使用第一个非缺失值的groupby.first

df.groupby(level=[0,1]).first()

#                 col_A col_B
#level_0 level_1        
#      A       x    1.0   2.0
#              y    2.0   1.0

答案 2 :(得分:2)

groupby名称上使用index,并获取first个值。

In [642]: df.groupby(level=df.index.names).first()
Out[642]:
                 col_A  col_B
level_0 level_1
A       x          1.0    2.0
        y          2.0    1.0

注意:发布编辑后,意识到它与Psidom的答案几乎完全相同。 level

的次要通用编辑

答案 3 :(得分:1)

或者您可以使用idxmax

df.reset_index().groupby(['level_0','level_1']).idxmax()

或只是使用

df.stack().unstack()

Out[242]: 
                 col_A  col_B
level_0 level_1              
A       x          1.0    2.0
        y          2.0    1.0