1. 删除相关
drop
方法的inplace
参数和axis
参数
如今有这样一个Dataframe,有两列,一列名为Id
,一列名为Name
,现如今我想删除Id
这一列,如下方法是错误的:
1 | df.drop(columns="Id") |
如下方法是正确的:
1 | df.drop(columns="Id", inplace=True) |
官方文档是这样提到inplace
参数的:
inplace: bool, default False
If False, return a copy. Otherwise, do operation inplace and return None.
默认是False,当此参数为False的时候,该方法返回一份Dataframe的拷贝;若为True,则返回一个空对象None。
对于axis
参数,文档是这样写的:
axis: 0 or ‘index’, 1 or ‘columns’, default 0
Whether to drop labels from the index (0 or ‘index’) or columns (1 or ‘columns’).
也就是说,drop
方法默认删除行,要想删除列,需要指定axis
参数为1。
删除特定索引的行/列
曾经听过很重要的一句话,”在Pandas
里,行有索引,列有名称”。也就是说,如果想删除特定索引的行,要用行号删除;删除特定索引的列,要用列的名称删除。
举个例子,我们有如下格式的文件:
想要删除前两行,用如下的代码删除就行:
1 | df.drop([0,1], inplace=True) |
若想删除前两列,不能用:
1 | df.drop([0,1], inplace=True, axis=1) |
这样做会报错,报错如下:
KeyError: ‘[0, 1] not found in axis’
因为列有名称,名为0和1的列没法在Dataframe中找到。想删除,则需要根据索引获取列名:
1 | df.drop(df.columns[[0,1]], inplace=True, axis=1) |
2. 输出.csv文件的格式
在Kaggle上提交文件,需要将文件的格式统一,若失败,常常是因为输出.csv的时候自动添加了索引,输出应该用以下代码:
1 | output_file.to_csv('submission.csv', index=False) |
3. 获取指定行/列
我常用iloc
方法,一般通过:
运算符获取。值得注意的是,最后一列用-1代替,而且3:5
,代表的是一个左闭右开区间。一些例子:
获取第4列
1 | df = df.iloc[:,3] |
第一个:
指,选择所有的行。
获取最后一列
1 | df = df.iloc[:,-1] |
获取除去最后一列外的所有列
1 | df = df.iloc[:, 0:-1] |
获取指定数据类型的列
1 | df = df.select_dtypes(include=['int64', 'float64']) |
4. NaN
值的处理方法
对于sklearn
的某些模型,比如RandomForestRegressor()
,输入的Dataframe不能有NaN
(Not a Number)的值。
一种处理方法是直接把含有NaN
的列删除掉,这种方法同时有可能会丢掉有价值的数据。
一种处理方法是换用允许NaN
的模型,比如将RandomForestRegressor()
换成HistGradientBoostingRegressor
。
还有一种处理方法是替换NaN
为该列的平均值:
1 | df = df.fillna(X_train.mean()) |
这行代码会计算每一列的均值,然后将每一列的NaN
换成其所在列的均值。