我想根据列的选择从现有的数据帧创建视图或数据帧。
例如,我想从一个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]
我做错了什么?也许更普遍的是,熊猫必须有什么机制来支持从数据框架中选择和排除任意列集?
类似地,在读取文件时,可能希望提前排除列,而不是浪费地将不需要的数据读入内存,然后丢弃它们。
从pandas 0.20.0开始,usecols现在接受callables.1此更新为读取列提供了更灵活的选项:
skipcols = [...]
read_csv(..., usecols=lambda x: x not in skipcols)
后一种模式本质上与传统的usecols方法相反——只跳过指定的列。
鉴于
文件中的数据
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
filename = "foo.csv"
df.to_csv(filename)
Code
skipcols = ["B", "D"]
df1 = pd.read_csv(filename, usecols=lambda x: x not in skipcols, index_col=0)
df1
输出
A C
0 0.062350 0.076924
1 -0.016872 1.091446
2 0.213050 1.646109
3 -1.196928 1.153497
4 -0.628839 -0.856529
...
细节
数据帧被写入文件。然后它被作为一个单独的DataFrame读回来,现在跳过了不需要的列(B和D)。
注意,对于OP的情况,因为已经创建了数据,所以更好的方法是接受答案,即从现有对象中删除不需要的列。但是,这里介绍的技术在直接将数据从文件读入DataFrame时最有用。
有人要求在本期中增加“skipcols”备选项,并在以后的一期中予以解决。
另一个选项,不需要在循环中删除或过滤:
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'))
# include the columns you want
df[df.columns[df.columns.isin(['A', 'B'])]]
# or more simply include columns:
df[['A', 'B']]
# exclude columns you don't want
df[df.columns[~df.columns.isin(['C','D'])]]
# or even simpler since 0.24
# with the caveat that it reorders columns alphabetically
df[df.columns.difference(['C', 'D'])]