我想根据列的选择从现有的数据帧创建视图或数据帧。

例如,我想从一个dataframe df1中创建一个dataframe df2,该dataframe df1包含除其中两个外的所有列。我试着这样做,但没有成功:

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]

我做错了什么?也许更普遍的是,熊猫必须有什么机制来支持从数据框架中选择和排除任意列集?


当前回答

你有四列A B C D

这里有一个更好的方法来选择你需要为新的数据框架的列:-

df2 = df1[['A','D']]

如果您希望使用列号,请使用:-

df2 = df1[[0,3]]

其他回答

你有四列A B C D

这里有一个更好的方法来选择你需要为新的数据框架的列:-

df2 = df1[['A','D']]

如果您希望使用列号,请使用:-

df2 = df1[[0,3]]

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

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

还可以看看内置的DataFrame。过滤功能。

极简但贪婪的方法(对给定的df足够):

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

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

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

保守的,一般的:

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

您可以删除不需要的列或选择需要的列

# 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']]

你只需要把你的集合转换成一个列表

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]