【问题标题】:Filter out rows/columns with zero values in MultiIndex dataframe在 MultiIndex 数据框中过滤掉零值的行/列
【发布时间】:2016-03-15 12:32:40
【问题描述】:

我在 python 中有以下 panda MultiIndex 数据框

             0         1         2         3 
bar one  0.000000 -0.929631  0.688818 -1.264180
    two  1.130977  0.063277  0.161366  0.598538
baz one  1.420532  0.052530 -0.701400  0.678847
    two -1.197097  0.314381  0.269551  1.115699
foo one -0.077463  0.437145 -0.202377  0.260864
    two -0.815926 -0.508988 -1.238619  0.899013
qux one -0.347863 -0.999990 -1.428958 -1.488556
    two  1.218567 -0.593987  0.099003  0.800736

我的问题,我该如何过滤掉:

  1. 包含零值的列 -- 上例中的第 0 列。
  2. 重新升级为行过滤。如何过滤带有零的行:(bar, one) 单独以及如何过滤 (bar, one) 和 (bar, two)?

    (对不起,我的母语不是英语;)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    要过滤掉包含零值的列,您可以使用

    df2 = df.loc[:, (df != 0).all(axis=0)]
    

    要过滤掉包含零值的行,您可以使用

    df2 = df.loc[(df != 0).all(axis=1), :]
    

    要过滤掉行,你可以使用

    df2 = df.drop('bar') ## drops both 'bar one' and 'bar two'
    df2 = df.drop(('baz', 'two')) ## drops only 'baz two'
    

    例如,

    import numpy as np
    arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']), np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
    df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
    df.ix['bar','one'][2] = 0
    df = df.loc[:, (df != 0).all(axis=0)]
    df = df.drop('bar')
    df = df.drop(('baz', 'two'))
    
    #                 0         1         3
    # baz one  0.686969  0.410614  0.841630
    # foo one  1.522938  0.555734 -1.585507
    #     two -0.975976  0.522571 -0.041386
    # qux one -0.991787  0.154645  0.179536
    #     two -0.725685  0.809784  0.394708
    

    如果您的数据框中没有 NaN 值,另一种方法是将您的 0 转换为 NaN 并删除具有 NaN 的列或行:

    df[df != 0.].dropna(axis=1) # to remove the columns with 0
    df[df != 0.].dropna(axis=0) # to remove the rows with 0
    

    最后,如果你想删除整个 'bar' 行,如果有一个零值,你可以这样做:

    indices = df.loc[(df == 0).any(axis=1), :].index.tolist() ## multi-index values that contain 0
    for ind in indices:
        df = df.drop(ind[0])
    

    【讨论】:

    • @Juilen,非常感谢您的及时回复。随着重新分级的行。如何以包含零的行为条件。 (忘记在我的问题中提及这一点)
    • @Dov 我编辑了我的答案。但是,如果两行中只有一个为零,我现在不知道如何过滤“一号栏”和“二号栏”。
    • @Juilen,太好了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2014-10-03
    • 2017-06-30
    • 2019-07-28
    • 2022-01-03
    • 2016-08-02
    相关资源
    最近更新 更多