熊猫中的布尔值和索引切片

时间:2019-10-08 10:47:42

标签: python pandas dataframe

假设我有一个数据帧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]]

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