我有一个包含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,)
谢谢
答案 0 :(得分:2)
IIUIC,您可以使用
In [348]: c = df.loc[[3]]
In [349]: c.loc[:, c.gt(0).all()]
Out[349]:
p6
3 1
答案 1 :(得分:1)
将0
和1
用作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
是不昂贵的。