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
过滤出列B
和D
你并不需要把它转换成一个集合:
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文档这部分答案是指。