【问题标题】:How to show only columns with value greater than x如何仅显示值大于 x 的列
【发布时间】:2019-01-13 11:12:01
【问题描述】:

我有一个包含 14000 行和 80 列的数据框,所有二进制条目(1 和 0),请参见下面的最小示例。 我想为某个索引(行)显示所有值>0的列。

import pandas as pd  
import numpy as np

dat = np.array([[0,1,0,1,0,0],
                [0,0,0,1,1,0],
                [1,0,0,0,0,0],
                [0,0,0,0,0,1],
                [0,1,0,1,0,0]])

df= pd.DataFrame(dat, columns = ["p%d" % (i + 1) for i in range(6)])

预期/想要的输出是显示指定索引(行)的值 >0 的所有列:

    p6
3    1

我尝试了以下方法,它显示了任何行中所有为 1 的列:

df.loc[df.index == 3, df.gt(0).any()]
# out:   
#      p1   p2  p4  p5  p6
#  3    0   0   0   0   1

还尝试了.all(),它将显示所有行中都有 1 的列。这些按列操作,而不仅仅是索引 == 3 处的值,可能是因为它在逗号之后,所以我也尝试了这个,给出了错误:

df.loc[(df.index == 3) & (df.gt(0).any())]
# ValueError: operands could not be broadcast together with shapes (5,) (6,)

谢谢你

【问题讨论】:

    标签: python arrays pandas dataframe slice


    【解决方案1】:

    您可以创建一个新系列聚合列名,然后使用loc 访问器:

    def get_cols(row):
        return row[row.astype(bool)].index.tolist()
    
    df['TrueCols'] = df.apply(get_cols, axis=1)
    
    print(df.loc[3, 'TrueCols'])  # ['p6']
    print(df.loc[1, 'TrueCols'])  # ['p4', 'p5']
    

    此解决方案的好处是您的结果是一步计算出来的。因此,为给定的索引/行重复调用 loc 以提取 TrueCols 的成本很低。

    【讨论】:

      【解决方案2】:

      01 用作bool

      df.loc[[3], df.loc[3].astype(bool)]
      
         p6
      3   1
      

      【讨论】:

        【解决方案3】:

        IIUIC,你可以使用

        In [348]: c = df.loc[[3]]
        
        In [349]: c.loc[:, c.gt(0).all()]
        Out[349]:
           p6
        3   1
        

        【讨论】:

        • 不错的解决方案。由于您只有二进制值,我认为eq(1)astype(bool) 可能更合适。
        • 我不喜欢这件事的两点。一:通过使用[[3]] 定义c,您需要稍后使用all()(1, n) 的维度减少到(n,)。二:虽然c的定义包含索引信息3这很聪明,这为在第二行中使用loc提供了方便,但如果您不熟悉索引将如何进行,也会让人感到困惑解决。我的两分钱。仍然是一个很好的答案(-:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        相关资源
        最近更新 更多