【问题标题】:Remove NaNs from DataFrame and duplicates from multi-index从 DataFrame 中删除 NaN 并从多索引中删除重复项
【发布时间】:2017-08-20 06:04:25
【问题描述】:

给定一个多索引 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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将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
    

    【讨论】:

    • 啊,这很聪明,可以通用df.sum(level=df.index.names)
    • 漂亮简洁
    【解决方案2】:

    index 名称上使用groupby,并采用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】:

      试试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
      

      【讨论】:

      • 先做吧~
      【解决方案4】:

      或者你可以使用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
      

      【讨论】:

        猜你喜欢
        • 2023-04-05
        • 1970-01-01
        • 2018-04-08
        • 2019-04-22
        • 1970-01-01
        • 2015-07-27
        • 2016-05-31
        • 2018-04-14
        相关资源
        最近更新 更多