【问题标题】:Dropping multiple Pandas columns by Index按索引删除多个 Pandas 列
【发布时间】:2019-01-16 20:35:21
【问题描述】:

我有一个大熊猫数据框(>100 列)。我需要删除各种列,我希望有一种使用旧的方法

df.drop(df.columns['slices'],axis=1)

我已经建立了选择,例如:

a = df.columns[3:23]
b = df.colums[-6:]

ab 代表我要删除的列集。

以下

list(df)[3:23]+list(df)[-6:]

产生正确的选择,但我无法用drop 实现它:

df.drop(df.columns[list(df)[3:23]+list(df)[-6:]],axis=1)

ValueError: 操作数不能与形状一起广播 (20,) (6,)

我环顾四周,但无法得到答案。

Selecting last n columns and excluding last n columns in dataframe

(以下与我收到的错误有关):

python numpy ValueError: operands could not be broadcast together with shapes

这个感觉就像他们遇到了类似的问题,但“切片”并不是分开的: Deleting multiple columns based on column names in Pandas

干杯

【问题讨论】:

  • 试试df.drop(columns=list(df)[3:23]+list(df)[-6:])
  • 这也很有效——像往常一样,给猫剥皮的方法不止一种。这更符合我想要达到的目标,非常感谢。

标签: python pandas numpy dataframe indexing


【解决方案1】:

您可以使用np.r_ 无缝组合多个范围/切片:

from string import ascii_uppercase

df = pd.DataFrame(columns=list(ascii_uppercase))

idx = np.r_[3:10, -5:0]

print(idx)

array([ 3,  4,  5,  6,  7,  8,  9, -5, -4, -3, -2, -1])

然后您可以使用idx 为您的列编制索引并提供给pd.DataFrame.drop

df.drop(df.columns[idx], axis=1, inplace=True)

print(df.columns)

Index(['A', 'B', 'C', 'K', 'L', 'M', 'N',
       'O','P', 'Q', 'R', 'S', 'T', 'U'], dtype='object')

【讨论】:

  • 我以为切片组合会有一些 np 函数,但我找不到。干杯
  • 我发现需要定义列表切片的末尾([-n:0] 中的 0),但我想我现在明白了。再次感谢!
【解决方案2】:

这将返回删除列的数据框

df.drop(list(df)[2:5], axis=1)

【讨论】:

    【解决方案3】:

    您可以使用这个简单的解决方案:

    cols = [3,7,10,12,14,16,18,20,22]
    df.drop(df.columns[cols],axis=1,inplace=True)
    

    结果:

        0   1   2   4   5   6   8   9    11  13      15     17      19       21
    0   3   12  10  3   2   1   7   512  64  1024.0  -1.0   -1.0    -1.0    -1.0
    1   5   12  10  3   2   1   7   16   2   32.0    32.0   1024.0  -1.0    -1.0
    2   5   12  10  3   2   1   7   512  2   32.0    32.0   32.0    -1.0    -1.0
    3   5   12  10  3   2   1   7   16   1   32.0    64.0   1024.0  -1.0    -1.0
    

    如您所见,具有给定索引的列已全部删除。

    如果我们假设您有 A、B、C ...等,您可以用数组中列的名称替换 int 值,您可以像这样替换 cols 中的 int 值,例如:

    cols = ['A','B','C','F']
    

    【讨论】:

      【解决方案4】:

      IIUC:

      a = df.columns[3:23].values.tolist()
      b = df.colums[-6:].values.tolist()
      
      a.extend(b)
      df.drop(a,1,inplace=True)
      

      【讨论】:

        【解决方案5】:

        我之前遇到过类似的问题并且遇到了麻烦,但通过从另一个“减去”一个df来解决它,不确定这是否对你有用,但它对我有用:

        df = df[~df.index.isin(a.index)]
        df = df[~df.index.isin(b.index)]
        

        【讨论】:

          猜你喜欢
          • 2013-09-08
          • 2014-09-27
          • 1970-01-01
          • 2018-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多