Python 如何仅显示值大于x的列
我有一个14000行80列的数据框,所有的二进制条目(1和0),见下面的最小示例。 我想为某个索引(行)显示值大于0的所有列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,
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