select/排除pandas中的一组列

我想根据列select从现有数据框中创build视图或数据框。

例如,我想从数据框df1创build一个数据框df2,其中包含除了其中两个列以外的所有列。 我试着做了以下,但它没有工作:

import numpy as np import pandas as pd # Create a dataframe with columns A,B,C and D df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) # Try to create a second dataframe df2 from df with all columns except 'B' and D my_cols = set(df.columns) my_cols.remove('B').remove('D') # This returns an error ("unhashable type: set") df2 = df[my_cols] 

我究竟做错了什么? 也许更一般的说,pandas有什么机制支持从数据框中挑选和排除任意列的列?

您可以删除不需要的列或select您需要的列

  ##Using DataFrame.drop df.drop(df.columns[[1, 2]], axis=1, inplace=True) # drop by Name df1 = df1.drop(['B', 'C'], axis=1) ## Select the ones you want df1 = df[['a','d']] 

有一个新的索引方法称为difference 。 它返回原始列,删除了作为parameter passing的列。

 df2 = df[df.columns.difference(['B', 'D'])] 

在这里,输出用于从df过滤出列BD

你并不需要把它转换成一个集合:

 cols = [col for col in df.columns if col not in ['B', 'D']] df2 = df[cols] 

也看看内置的DataFrame.filter函数。

简约但贪婪的方法(对于给定的DF是足够的):

 df.filter(regex="[^BD]") 

保守/懒惰的方法(仅限精确匹配):

 df.filter(regex="^(?!(B|D)$).*$") 

保守和通用:

 exclude_cols = ['B','C'] df.filter(regex="^(?!({0})$).*$".format('|'.join(exclude_cols))) 

你只需要将你的set转换成一个list

 import pandas as pd df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) my_cols = set(df.columns) my_cols.remove('B') my_cols.remove('D') my_cols = list(my_cols) df2 = df[my_cols] 

以下是如何创buildDataFrame副本 ,不包括列的列表:

 df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) df2 = df.drop(['B', 'D'], axis=1) 

不过要小心! 你提到你的问题的意见,build议如果你改变了df ,你也想要df2也改变。 (就像数据库中的一个视图一样)

这种方法没有达到:

 >>> df.loc[0, 'A'] = 999 # Change the first value in df >>> df.head(1) ABCD 0 999 -0.742688 -1.980673 -0.920133 >>> df2.head(1) # df2 is unchanged. It's not a view, it's a copy! AC 0 0.251262 -1.980673 

还要注意,@ piggybox的方法也是如此。 (虽然这个方法不错,光滑和Pythonic,我没有这样做!)

对于更多的观点与副本看到这个答案和pandas文档这部分答案是指。