Python 如何仅显示值大于x的列

Python 如何仅显示值大于x的列,python,arrays,pandas,dataframe,slice,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,

我有一个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的所有列:

我尝试了以下方法,它显示了任何行中都有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,)
谢谢你,IIUIC,你可以用

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

In [349]: c.loc[:, c.gt(0).all()]
Out[349]:
   p6
3   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
是便宜的。

使用
0
1
作为
bool

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

   p6
3   1

很好的解决方案。由于您只有二进制值,我认为
eq(1)
astype(bool)
可能更合适。第一:通过使用
[[3]]
来定义
c
,您就有必要在以后使用
all()
来将
(1,n)
的维度减少到
(n,)
。第二:虽然
c
的定义包含索引信息
3
很聪明,这为在第二行中使用
loc
提供了便利,但如果您不清楚索引将如何解决,这也会让人感到困惑。我的两分钱。这仍然是一个很好的答案
df.loc[[3], df.loc[3].astype(bool)]

   p6
3   1