如何仅显示值大于x的列

时间:2018-08-06 13:13:54

标签: python arrays pandas dataframe slice

我有一个包含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,)

谢谢

3 个答案:

答案 0 :(得分:2)

IIUIC,您可以使用

In [348]: c = df.loc[[3]]

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

答案 1 :(得分:1)

01用作bool

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

   p6
3   1

答案 2 :(得分:0)

您可以创建一个新的系列以汇总列名,然后使用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是不昂贵的。