我想根据列的选择从现有的数据帧创建视图或数据帧。
例如,我想从一个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]
我做错了什么?也许更普遍的是,熊猫必须有什么机制来支持从数据框架中选择和排除任意列集?
有一种新的索引方法叫做差。它返回原始列,作为参数传递的列被删除。
这里,结果用于从df中删除列B和D:
df2 = df[df.columns.difference(['B', 'D'])]
注意,这是一个基于集合的方法,因此重复的列名会导致问题,而且列的顺序可能会改变。
与drop相比的优点:当您只需要列列表时,您不需要创建整个数据框架的副本。例如,为了在列的子集上删除重复项:
# may create a copy of the dataframe
subset = df.drop(['B', 'D'], axis=1).columns
# does not create a copy the dataframe
subset = df.columns.difference(['B', 'D'])
df = df.drop_duplicates(subset=subset)
有一种新的索引方法叫做差。它返回原始列,作为参数传递的列被删除。
这里,结果用于从df中删除列B和D:
df2 = df[df.columns.difference(['B', 'D'])]
注意,这是一个基于集合的方法,因此重复的列名会导致问题,而且列的顺序可能会改变。
与drop相比的优点:当您只需要列列表时,您不需要创建整个数据框架的副本。例如,为了在列的子集上删除重复项:
# may create a copy of the dataframe
subset = df.drop(['B', 'D'], axis=1).columns
# does not create a copy the dataframe
subset = df.columns.difference(['B', 'D'])
df = df.drop_duplicates(subset=subset)