【问题标题】:How to select all columns, except one column in pandas?如何选择所有列,除了熊猫中的一列?
【发布时间】:2015-06-28 02:34:30
【问题描述】:

我有一个如下所示的数据框:

import pandas
import numpy as np
df = DataFrame(np.random.rand(4,4), columns = list('abcd'))
df
      a         b         c         d
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

如何获取除column b 之外的所有列?

【问题讨论】:

  • @cs95 -- 当前列出的重复目标不是重复的。尽管有原始标题,但链接的问题是“为什么这个特定的语法不起作用”,而这个问题是一个更笼统的“什么是最好的方法来做到这一点”。 -- 加上从现有 DataFrame 中删除一列与创建一个新 DataFrame 与另一个列的所有但一个列之间的区别。
  • @R.M.很抱歉,但我不同意您对该帖子标题所做的编辑,所以我已将其回滚。确实,OP 的意图是质疑语法,但这篇文章已经发展到解决如何删除列的更广泛的问题。这篇文章中的答案是那里投票率最高的帖子的副本。骗子留下了。
  • 注意这个问题正在Meta讨论。

标签: python pandas


【解决方案1】:

当列不是 MultiIndex 时,df.columns 只是一个列名数组,因此您可以这样做:

df.loc[:, df.columns != 'b']

          a         c         d
0  0.561196  0.013768  0.772827
1  0.882641  0.615396  0.075381
2  0.368824  0.651378  0.397203
3  0.788730  0.568099  0.869127

【讨论】:

  • 还不错,但@mike 使用drop 的解决方案是更好的IMO。更具可读性并处理多索引
  • 我实际上同意@mike 使用drop 的解决方案更好 - 我认为发现(单级)列是您可以使用的数组很有用,但专门用于删除列, drop 可读性很强,可以很好地处理复杂的索引。
  • 感谢您的出色回答。如果我没有标题怎么办?我该如何处理?
  • 当你有超过 1 列要被忽略时怎么办?
  • @Marius 这是否适用于多列(比如两列)?
【解决方案2】:

不要使用ix。这是deprecated。最易读和最惯用的方式是df.drop()

>>> df

          a         b         c         d
0  0.175127  0.191051  0.382122  0.869242
1  0.414376  0.300502  0.554819  0.497524
2  0.142878  0.406830  0.314240  0.093132
3  0.337368  0.851783  0.933441  0.949598

>>> df.drop('b', axis=1)

          a         c         d
0  0.175127  0.382122  0.869242
1  0.414376  0.554819  0.497524
2  0.142878  0.314240  0.093132
3  0.337368  0.933441  0.949598

注意默认情况下.drop()不会就地操作;尽管名字不祥,df 并没有受到这个过程的伤害。如果您想从df 中永久删除b,请执行df.drop('b', inplace=True)

df.drop() 也接受标签列表,例如df.drop(['a', 'b'], axis=1) 将删除列 ab

【讨论】:

  • 也适用于多索引,就像您期望的那样。 df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1)。似乎使用列表与元组来确定您是想要多列(列表)还是引用多索引(元组)。
  • 更具可读性:df.drop(columns='a')df.drop(columns=['a', 'b'])。也可以用index=替换columns=
  • 但是,如果您碰巧知道要删除的所有列的名称,这将没有用。
  • 由于这会创建一个副本而不是视图/参考,因此您无法通过在分配的 LHS 上使用它来修改原始数据框。
  • @JanChristophTerasa 你碰巧知道如何在原始 df 中修改这些选定的列(例如将所有这些列与另一列的值相乘)。如果我修改这些值,我需要在最后添加删除的列,这似乎不是最好的方法。
【解决方案3】:

这是另一种方式:

df[[i for i in list(df.columns) if i != '<your column>']]

您只需传递所有要显示的列,不想要的列除外。

【讨论】:

    【解决方案4】:
    df[df.columns.difference(['b'])]
    
    Out: 
              a         c         d
    0  0.427809  0.459807  0.333869
    1  0.678031  0.668346  0.645951
    2  0.996573  0.673730  0.314911
    3  0.786942  0.719665  0.330833
    

    【讨论】:

    • 我喜欢这种方法,因为它可以用来省略多个列。
    • @NischalHp df.drop 也可以省略多列 df.drop(['a', 'b'], axis=1)
    • 我认为值得注意的是,这可以重新排列您的列
    • @ocean800 是的,这是真的。如果你想避免这种行为,你可以传递sort=False (df.columns.difference(['b'], sort=False))
    【解决方案5】:

    我认为最好的方法是@Salvador Dali 提到的方法。并不是说其他​​人错了。

    因为当您有一个数据集时,您只想选择一列并将其放入一个变量中,而将其余列放入另一个变量中以进行比较或计算。然后删除数据集的列可能无济于事。当然,也有一些用例。

    x_cols = [x for x in data.columns if x != 'name of column to be excluded']
    

    然后,您可以将变量 x_cols 中的这些列集合放入另一个变量中,例如 x_cols1 以进行其他计算。

    ex: x_cols1 = data[x_cols]
    

    【讨论】:

    • 你能解释一下为什么这是一个单独的答案而不是对萨尔瓦多答案的评论/扩展吗?
    【解决方案6】:

    对@Salvador Dali 的另一项细微修改允许排除列列表:

    df[[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]
    

    df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]
    

    【讨论】:

      【解决方案7】:

      您可以使用df.columns.isin()

      df.loc[:, ~df.columns.isin(['b'])]
      

      当你想删除多个列时,很简单:

      df.loc[:, ~df.columns.isin(['col1', 'col2'])]
      

      【讨论】:

      • 这个方法对修改选中的列很有帮助!
      【解决方案8】:

      这是一个单行 lambda:

      df[map(lambda x :x not in ['b'], list(df.columns))]
      

      之前

      import pandas
      import numpy as np
      df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))
      df
      
             a           b           c           d
      0   0.774951    0.079351    0.118437    0.735799
      1   0.615547    0.203062    0.437672    0.912781
      2   0.804140    0.708514    0.156943    0.104416
      3   0.226051    0.641862    0.739839    0.434230
      

      之后

      df[map(lambda x :x not in ['b'], list(df.columns))]
      
              a          c          d
      0   0.774951    0.118437    0.735799
      1   0.615547    0.437672    0.912781
      2   0.804140    0.156943    0.104416
      3   0.226051    0.739839    0.434230
      

      【讨论】:

        【解决方案9】:

        我认为一个不错的解决方案是使用 pandas 的 filterregex 函数(匹配除“b”之外的所有内容):

        df.filter(regex="^(?!b$)")
        

        【讨论】:

          【解决方案10】:

          您可以在索引中drop 列:

          df[df.columns.drop('b')]
          

          df.loc[:, df.columns.drop('b')]
          

          输出:

                    a         c         d
          0  0.418762  0.869203  0.972314
          1  0.991058  0.594784  0.534366
          2  0.407472  0.396664  0.894202
          3  0.726168  0.324932  0.906575
          

          【讨论】:

            【解决方案11】:

            类似于@Toms 的回答,也可以在不使用 .loc 的情况下选择除“b”之外的所有列,如下所示:

            df[df.columns[~df.columns.isin(['b'])]]
            

            【讨论】:

              猜你喜欢
              • 2018-05-05
              • 1970-01-01
              • 2019-06-20
              • 1970-01-01
              • 2019-11-18
              • 1970-01-01
              • 2013-02-03
              • 2018-06-25
              相关资源
              最近更新 更多