根据熊猫中的列名删除多个列


94

我有一些数据,导入时会得到以下不需要的列,我正在寻找一种删除所有这些数据的简便方法

   'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27',
   'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31',
   'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35',
   'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39',
   'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43',
   'Unnamed: 44', 'Unnamed: 45', 'Unnamed: 46', 'Unnamed: 47',
   'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51',
   'Unnamed: 52', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55',
   'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59',
   'Unnamed: 60'

它们被0索引索引,所以我尝试了类似

    df.drop(df.columns[[22, 23, 24, 25, 
    26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)

但这不是很有效。我尝试编写一些for循环,但这使我感到震惊,因为熊猫的行为不佳。因此,我在这里问这个问题。

我已经看到了一些类似的示例(投递多列pandas),但这无法回答我的问题。


2
你是什​​么意思,高效?运行太慢了吗?如果您的问题是您不想获取要删除的所有列的索引,请注意,您只可以提供df.drop列名列表:df.drop(['Unnamed: 24', 'Unnamed: 25', ...], axis=1)
Carsten 2015年

仅对感兴趣的列进行子集化会不会更容易:例如df = df[cols_of_interest],否则您可以按列对df进行切片并获得列df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
EdChum 2015年

2
我的意思是打字或“不好的代码味道”方面的效率低下
Peadar Coyle

1
可能是值得注意的是,在大多数情况下,它更容易只是为了让列你想要然后删除那些你不这样做:DF = DF [“col_list”]
麻雀

Answers:


65

我不知道您所说的低效率是什么意思,但是如果您指的是打字,那么选择感兴趣的cols并分配回df会更容易:

df = df[cols_of_interest]

cols_of_interest您关心的列的列表在哪里。

或者,您可以切片列并将其传递给drop

df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)

调用head只会选择0行,因为我们只对列名而不是数据感兴趣

更新

另一种方法:使用from中的布尔掩码str.contains并将其反转以掩码列会更简单:

In [2]:
df = pd.DataFrame(columns=['a','Unnamed: 1', 'Unnamed: 1','foo'])
df

Out[2]:
Empty DataFrame
Columns: [a, Unnamed: 1, Unnamed: 1, foo]
Index: []

In [4]:
~df.columns.str.contains('Unnamed:')

Out[4]:
array([ True, False, False,  True], dtype=bool)

In [5]:
df[df.columns[~df.columns.str.contains('Unnamed:')]]

Out[5]:
Empty DataFrame
Columns: [a, foo]
Index: []

当我尝试执行〜df.columns ...(TypeError:一元〜的错误操作数类型:'str')或df.columns.str.contains ...(AttributeError:'Index'对象没有属性)时,出现错误'str')。任何想法为什么会这样?
戴军

@EdChum我可以创建df = df [cols_of_interest],其中,每当for循环迭代时,cols_of_interest为其添加列名吗?

@Victor不,如果您这样做,则应该df用新的列覆盖您,append但我可能不太了解您的问题,您应该在SO上发布真实的问题,而不是提出评论,因为它在SO上表现不佳
EdChum

@EdChum,您绝对正确。我已经创建了这个问题,并且试图通过搜索SO的不同部分来解决它。链接在这里 !任何贡献都将有助于stackoverflow.com/questions/48923915/…–

212

到目前为止,最简单的方法是:

yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)

1
我在某些代码中使用了这种格式,并且收到SettingWithCopyWarning警告?
KillerSnail

2
@KillerSnail,可以忽略。为避免错误,请尝试:df = df.drop([''colheading1','colheading2'],axis = 1)
Philipp Schwarz

5
该术语axis解释为:stackoverflow.com/questions/22149584/…。本质上,axis=0被称为“列方式”和axis=1“行方式”。
罗默(Rohmer)

5
并且inplace=True表示DataFrame修改到位。
罗默(Rohmer)

1
@Killernail,如果您不想要警告,yourdf = yourdf.drop(['columnheading1', 'columnheading2'], axis=1)
那就

41

我个人的最爱,并且比我在这里看到的答案更容易(针对多列内容):

df.drop(df.columns[22:56], axis=1, inplace=True)

或为多列创建一个列表。

col = list(df.columns)[22:56]
df.drop(col, axis=1, inplace=1)

8
这应该是答案。简洁,易于阅读,并具有直接的本地Pandas索引语法。
布伦特·浮士德

2
这个答案旁边应该有绿色的勾号,而不是其他的。
西沃什·马布比

1
较小的更正(除非我弄错了):第二个代码块应具有“ inplace = True”而不是“ inplace = 1”。
Thredolsen

20

这可能是做您想要的事情的好方法。它将删除标题中包含“未命名”的所有列。

for col in df.columns:
    if 'Unnamed' in col:
        del df[col]

for col in df.columns:可以简化为for col in df:,也是OP未指明的命名方案是什么其他列,他们可能都含有“未命名”,也这是低效的,因为它消除列一次一个
EdChum

这肯定不是有效的,但是只要我们不处理庞大的数据帧,它就不会产生重大影响。这种方法的优点是,它易于记住并且编写代码快速-在创建要保留的列的列表时会很痛苦。
knightofni 2015年

我认为这很可能是大DF最高效的,因为你没有做一个本地副本inplace = True
马特

13

您可以一行一行地执行此操作:

df.drop([col for col in df.columns if "Unnamed" in col], axis=1, inplace=True)

与上面的解决方案相比,这涉及较少的对象移动/复制。


11

不知道该解决方案是否在任何地方都被提及,但是一种解决方法是pandas.Index.difference

>>> df = pd.DataFrame(columns=['A','B','C','D'])
>>> df
Empty DataFrame
Columns: [A, B, C, D]
Index: []
>>> to_remove = ['A','C']
>>> df = df[df.columns.difference(to_remove)]
>>> df
Empty DataFrame
Columns: [B, D]
Index: []

4

您只需将轴名称指定为0或1即可将列名称作为列表传递

  • 轴= 1:沿行
  • axis = 0:沿列
  • 默认情况下轴= 0

    data.drop(["Colname1","Colname2","Colname3","Colname4"],axis=1)


4

简单又容易。在22日之后删除所有列。

df.drop(columns=df.columns[22:]) # love it

要进行修改df,请添加标志inplace=True,这样df.drop(columns=df.columns[22:], inplace=True)
arilwan

1

下面为我​​工作:

for col in df:
    if 'Unnamed' in col:
        #del df[col]
        print col
        try:
            df.drop(col, axis=1, inplace=True)
        except Exception:
            pass

0

df = df[[col for col in df.columns if not ('Unnamed' in col)]]


1
这与Peter的相似,只是不想要的列被过滤掉而不是丢弃。
莎拉,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.