假设我有一个数据帧df
和一个列索引idx
-然后,我只能使用idx
中的列并且值等于1乘以< / p>
df_1=df[df==1].iloc[idx]
但是我想我在某处读过,以这种方式进行切片效率不高,因为第一个df[df==1]
会产生一个新的数据帧,然后将其切片。
是否真的不可能一行完成,例如
df_1=df[df==1,idx]
或df_1=df.iloc[df==1,idx]
编辑:添加了数据样本
(我知道它看起来像一个np.array,但它是一个pd.DataFrame)
df=[[1,1,0,0,0],
[0,0,0,0,0],
[0,0,0,0,1]]
预期收益
df_1=[[1,1,0],
[0,0,1]]
答案 0 :(得分:1)
第一个可能的解决方案是测试1
的所有行,然后按idx
过滤列:
df= pd.DataFrame([[1,1,0,0,0],
[0,0,0,0,0],
[0,0,0,0,1]], columns=list('abcde'))
idx = [0,1,4]
df_1 = df.iloc[(df==1).any(axis=1).values, idx]
print (df_1)
a b e
0 1 1 0
2 0 0 1
详细信息:
print (df==1)
a b c d e
0 True True False False False
1 False False False False False
2 False False False False True
或先按idx
过滤列,然后测试1
:
df_1 = df.iloc[(df.iloc[:, idx]==1).any(axis=1).values, idx]
详细信息:
print (df.iloc[:, idx]==1)
a b e
0 True True False
1 False False False
2 False False True