如何在DataFrame中删除除特定列以外的所有列?

160
假设我有一个类似这样的DataFrame:
a  b  c  d  e  f  g  
1  2  3  4  5  6  7
4  3  7  1  6  9  4
8  9  0  2  4  2  1

我该如何删除除了 ab 以外的每一列?

这将导致以下结果:

a  b
1  2
4  3
8  9

我希望有一种简单的代码可以删除所有列,除了 ab,因为假设我有1000列数据。

谢谢。

6个回答

153
In [48]: df.drop(df.columns.difference(['a','b']), 1, inplace=True)
Out[48]:
   a  b
0  1  2
1  4  3
2  8  9
或者:
In [55]: df = df.loc[:, df.columns.intersection(['a','b'])]

In [56]: df
Out[56]:
   a  b
0  1  2
1  4  3
2  8  9

PS请注意,@Wen已经提出了最常用的Pandas方法 来完成此操作:


请注意,@Wen已经提出了最常用的Pandas方法来完成此操作。
df = df[['a','b']]
或者
df = df.loc[:, ['a','b']]

2
使用inplace和不使用inplace会有性能或其他方面的区别吗?更一般的问题是df.drop(... inplace=True)与df = df[...],有什么建议吗? - PirateApp
3
@PirateApp,可能会有一些微小的差异。我建议你阅读[这篇来自Pandas主要开发人员Jeff的回答以及该回答下的评论......] (https://dev59.com/CWEh5IYBdhLWcg3wVCPK#22533110) - MaxU - stand with Ukraine
@MaxU 我认为 df.loc 处理数百万条记录比任何其他方法(如 dropfilter)都要快得多。如果我错了,请纠正我。 - Abu Shoeb

102

另一个添加到混合物中的选项。我更喜欢这种方法,因为它更易读。

df = df.filter(['a', 'b'])

第一个位置参数是 items=[]


奖励部分

你也可以使用 like 参数或 regex 进行过滤。
如果你有一组列像 ['a_1','a_2','b_1','b_2'],这将非常有帮助。

你可以这样做

df = df.filter(like='b_')

最终得到['b_1','b_2']

Pandas filter函数的文档。


59
有多种解决方案。
df = df[['a','b']] #1

df = df[list('ab')] #2

df = df.loc[:,df.columns.isin(['a','b'])] #3

df = pd.DataFrame(data=df.eval('a,b').T,columns=['a','b']) #4 PS:I do not recommend this method , but still a way to achieve this 

7
如果你想处理子集,可以使用df = df[['a','b']] - Zero

5

嘿,你想要查找的是:

df = df[["a","b"]]

您将收到一个仅包含列a和b的数据框。

目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - lemon
这与@BENY的答案(https://dev59.com/w1cO5IYBdhLWcg3waw6o#45846274)的第一个选项没有区别。 - Akaisteph7

3

如果您只想保留比删除更多的列,请在.isin语句之前加上“~”以选择除您想要的列之外的每一列:

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

这是唯一的答案。 "除了保留列之外删除其他列"。 谢谢,我正在寻找这个。 - Natacha

2

如果您想要删除两列以上的数据,比如 2030 列,您也可以使用列表。请确保您同时指定了轴的值。

drop_list = ["a","b"]
df = df.drop(df.columns.difference(drop_list), axis=1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接