【问题标题】:boolean and index-slicing in PandasPandas 中的布尔和索引切片
【发布时间】:2019-10-08 10:47:42
【问题描述】:

假设我有一个数据框 df 和一个列索引 idx - 然后我可以只使用来自 idx 的列和等于 1 by 的值来获取一个新的数据框

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]]

【问题讨论】:

  • 你能添加一些数据样本吗?
  • 现在已经添加了
  • idx 是什么?
  • 上面写着-我要切片的列索引

标签: python pandas dataframe


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多