Pandas库的一些用法备忘
2023-07-27 11:22:39

1. 删除相关

drop方法的inplace参数和axis参数

如今有这样一个Dataframe,有两列,一列名为Id,一列名为Name,现如今我想删除Id这一列,如下方法是错误的:

1
2
df.drop(columns="Id")
df = df.drop(columns="Id", inplace=True)

如下方法是正确的:

1
2
df.drop(columns="Id", inplace=True)
df = df.drop(columns="Id")

官方文档是这样提到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换成其所在列的均值。