假设我有一个如下所示的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
如何删除a
和b
以外的所有列?
这将导致:
a b
1 2
4 3
8 9
我想用一种简单的代码行删除这些内容,删除a
和b
以外的所有列,因为假设我有1000列数据。
谢谢。
答案 0 :(得分:18)
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请注意the most idiomatic Pandas way to do that was already proposed by @Wen:
df = df[['a','b']]
或
df = df.loc[:, ['a','b']]
答案 1 :(得分:9)
有多种解决方案。
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
答案 2 :(得分:6)
要添加到混合中的另一个选项。我更喜欢这种方法以提高可读性。
df = df.filter(['a', 'b'])
或者简单地
df.filter(['a', 'b'])
您还可以使用like
参数或regex
进行过滤。
如果您有一组像['a_1','a_2','b_1','b_2']
你可以做
df.filter(like='b_')
并以['b_1','b_2']
答案 3 :(得分:0)
如果要删除的列超过两个,例如20
或30
,则也可以使用列表。确保还指定了轴值。
drop_list = ["a","b"]
df = df.drop(df.columns.difference(drop_list), axis=1)
答案 4 :(得分:-1)
如果您只想保留比删除更多的列,请在.isin语句之前添加“〜”,以选择除所需列之外的每一列:
df = df.loc[:, ~df.columns.isin(['a','b'])]