前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >精品教学案例 | 金融贷款数据的清洗

精品教学案例 | 金融贷款数据的清洗

原创
作者头像
数据酷客
修改2020-05-11 17:58:48
4.3K0
修改2020-05-11 17:58:48
举报

查看本案例完整的数据、代码和报告请登录数据酷客(http://cookdata.cn)案例板块。

本案例适合作为大数据专业数据清洗或Pandas数据分析课程的配套教学案例。通过本案例,能够达到以下教学效果:

  • 培养学生对真实数据进行清洗的能力。案例基于一份真实的Lending Club贷款数据集,进行数据预处理。
  • 帮助学生熟悉数据清洗的常用方法。例如:缺失值、异常值以及重复值的检测和处理。
  • 提高学生动手实践能力。案例中使用Pandas、Seaborn和Matplotlib等工具对数据进行清洗和可视化操作,提高学生对工具的使用熟练程度。

1.数据读取

本案例主要背景为贷款情况审查。银行可以通过个人贷款状况对个人信用进行分类,从而更好地避免金融诈骗的发生。本案例所选的数据集是来自LendingClub中统计的2018年第四季度的借贷数据。

数据集共有90112行,145列。此处挑选具有代表性的列说明其含义,完整的数据字典可以查看源数据网页中的DATA DICTIONARY。

代码语言:javascript
复制
## 导入类库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns

使用Pandas的read_csv()函数读取数据,并查看数据。

代码语言:javascript
复制
dataset = pd.read_csv("./input/lendingclub.csv")
dataset.head(5)

该数据集包含在规定时间内发放的所有贷款的完整贷款数据,包括当前贷款状态loan_status(延迟,全额支付等)和settlement_status(最新支付信息)等。包含通过前一个完成的日历季度发放的所有贷款的完整贷款数据。

查看数据集中行与列数量。

代码语言:javascript
复制
dataset.shape

可见数据集共有90112行,145列。

2.数据清洗

2.1 缺失值的查看

首先介绍在数据缺失值处理中所经常用到的函数isnulldropnafillnanotnull

一般来说,在进行数据清洗的时候会先使用isnull函数来查看对应的缺失值所对应的地方,如果直接使用isnull函数来对数据进行缺失值的直接查看,那么返回一个布尔类型数据集,该数据集与原始数据格式相同,例如一个数据集使用了Numpy的数组存储,那么返回的就是含有布尔值的数组,如果使用的是Pandas的DataFrame存储,那么返回的就是含有布尔值的DataFrame

代码语言:javascript
复制
## 查缺失值的前10行数据
dataset.isnull().head(10)

可见直接调用isnull()函数处理大数据集只能得到一个存有True或者False的数据集,结果并不直观,需要对结果进一步处理。

查看数据中缺失值数量所占总数据量的百分比,从而使结果更加直观,以便进一步处理缺失值。

创建一个新的DataFrame数据表来存储每列数据中缺失值所占的百分比。

代码语言:javascript
复制
na_ratio = pd.DataFrame(dataset.isnull().sum()/len(dataset)*100,columns=['NA_Ratio'])

由于数据列过多,选取查看缺失值占总数据百分比大于90%的列名及其数值。

代码语言:javascript
复制
df_na = na_ratio[na_ratio['NA_Ratio']>=90].sort_values(by = 'NA_Ratio', ascending=False)
df_na

可见还是有较多的列几乎全部为空,对于这些列一般都可以简单地认为它在数据分析中提供极有限信息,所以可以直接删除。

由于数据列过多,选取缺失值占总数据百分比大于0.01%,小于80%的列名及其数值显示到图上。

代码语言:javascript
复制
df_na = na_ratio[(na_ratio['NA_Ratio']<80 ) & (na_ratio['NA_Ratio']>=0.01)].sort_values(by = 'NA_Ratio', ascending=False)
## 绘图
fig, ax = plt.subplots(figsize=(20,10))
nar = sns.barplot(x=df_na.index, y=df_na['NA_Ratio'],orient='v',palette="Blues_d")
ax.set_xticklabels(df_na.index, rotation=90, fontsize=20)
ax.set_ylabel('Ratio of Missing Values', fontsize=25)
ax.set_xlabel('Features', fontsize=25)
ax.set_title('Ratio of Missing Values by Features', fontsize=30)
for loc, value in zip(ax.patches, df_na.NA_Ratio):
    ax.text(loc.get_x()+loc.get_width()/2, loc.get_height()+2, round(value,2),ha='center', va='bottom',fontsize=16)
plt.show()

由此可见,部分数据中缺失值较多,故可以尝试使用多种方法删除或填补。

2.2 删除缺失值

通过删除缺失值过多的列来进行初步的数据清洗工作。

一般来说,删除缺失值所用的函数是dropna(),其原理是删除带有任何存有缺失值的行,对于真实数据集中不同列有不同的缺失值存在的地方,甚至可能有某一列全是缺失值,简单使用dropna()函数就会直接得到如下的结果。

代码语言:javascript
复制
dataset.dropna()

依据上面的表可以发现,简单使用dropna()函数只会让数据结果无效化,不仅删除了缺失值的信息,也删除了所有的暂时不需要删除的信息,故而依据之前所查看缺失值画的柱状图,可以发现缺失值比例在(0.01%,80%)的列中,除3列数据缺失值在56%以上,其余列数据的缺失值均小于17%,故可以简单认为在此数据集中缺失值在56%以上的数据列提供信息有限,故将缺失百分比56%以上的列数据全部删除。

代码语言:javascript
复制
null_index = list(na_ratio[na_ratio['NA_Ratio']>=56].index)
print("需要删除的缺失值较多的列为:",null_index)

使用copy()函数拷贝一份原数据的副本进行处理,以免接下来的步骤出错导致需要重新读取数据。处理完毕后查看新数据集行与列的情况以确认删除成功。

代码语言:javascript
复制
dataset_copy = dataset.copy()

使用drop()函数直接删除整行或整列数据,其中参数axis控制以列(0)或者以行(1)的形式删除,inplace代表处理完毕后是否替换这个DataFrame

代码语言:javascript
复制
dataset_copy.drop(null_index,axis=1,inplace=True)
dataset_copy.shape

在处理完毕后,可以发现行的数量没有改变,列数量减少到了102列,故而删除成功。

2.3 简易填补缺失值

删除掉含有较多缺失值的列后,需要填补剩余的包含缺失值的列。使用fillna()函数填补缺失值,该函数能自动定位到所有缺失值所在的位置,并将其补齐。

对剩下的列进行不同的填补方式的处理。对缺失值还是较多的列分别进行平均数,众数以及中位数的填补。

代码语言:javascript
复制
less_null_index = list(na_ratio[(na_ratio['NA_Ratio']<=56) & (na_ratio['NA_Ratio']>=8)].index)
print("需要填补的缺失值的列为:",less_null_index)

首先分别查看这四列的信息,以方便之后进行填补。

代码语言:javascript
复制
dataset_copy[less_null_index].head(5)
代码语言:javascript
复制
dataset_copy[less_null_index].dtypes

通过查看可以得知,这四列数据分别为字符型以及浮点型数据,对这四列分别进行不同的办法的填补。

DataFrame求其一列即Series对象中的均值的方法为mean,众数的方法为mode,中位数的方法为median

首先是对字符型的填补。

emp_title列的意思是借款人在申请贷款时提供的职务,此处为空的情况下不能简单的进行填补,因为有可能空值代表该人无职业或者职业不明确,也没有好的办法对这些缺失值的职业进行判断,此处使用哑变量的思路进行填补,对缺失值进行新属性的添加,设置其为workless即可。

代码语言:javascript
复制
dataset_copy['emp_title'].fillna("workless", inplace=True)
dataset_copy['emp_title'].isnull().sum()

可以看到在进行哑变量的填补之后,缺失值也被填补完毕。

emp_length列是所有贷款帐户用户的工作年限,此处尝试使用中位数的方法进行填补。

首先查看该列的中位数是多少,由于该列存储的是字符串数据,且都为年份,但是表达的含义是数值型,故而先使用正则表达式将其匹配转换为数值型,然后求其中位数。

首先导入正则表达式所需要的包re。

代码语言:javascript
复制
## 导入包
import re
代码语言:javascript
复制
pattern = re.compile(r'\d+')
## 初始化一个列表
result = []
## 因为有缺失值的存在,会使得正则表达式失败,使程序报错退出,故而引入异常检测来规避缺失值
for i in list(range(0,len(dataset_copy['emp_length']))):
    try:
        replace_number = int(pattern.findall(dataset_copy['emp_length'][i])[0])
        result.append(replace_number)
        ## 此处可以直接对原DataFrame的数据进行替换,若此处进行替换操作,会因为DataFrame拷贝操作而导致耗时极长
        ## dataset_copy['emp_length'][i] = replace_number
    except:
        pass

查看一下是否将所有的非缺失值存储到列表中了,此处使用notnull()函数来查看所有的非缺失值数量。

代码语言:javascript
复制
print("列表长度",len(result))
print("非缺失值的数量",dataset_copy['emp_length'].notnull().sum())

新建一个DataFrame来存储新的数据,由此新的DataFrame来计算得到所需的中位数的值,再填补回原数据中。

在此使用median函数来求得该列的中位数。

代码语言:javascript
复制
df = pd.DataFrame()
df['result'] = result
df.median()

可见其中位数的值是5,也代表若将客户的工作年限从小到大排列,其中间的工作年限是5年

将信息补完,再填补回原数据中。此处使用简单的字符串粘贴即可。

代码语言:javascript
复制
replace_str = str(int(df.median()))+ " years"
print(replace_str)

使用fillna()函数来填补缺失值。

代码语言:javascript
复制
dataset_copy['emp_length'].fillna(replace_str,inplace=True)
dataset_copy['emp_length'].isnull().sum()

可见该列缺失值的数量为0,填补成功。

接下来对其余两列进行填补。

il_util列是所有贷款帐户的当前总余额占信用限额的比例,采取简单的均值填补的方式。

首先查看该列的均值为多少。

代码语言:javascript
复制
dataset_copy['il_util'].mean()

接下来就使用fillna()函数来对其进行填补。

代码语言:javascript
复制
dataset_copy['il_util'].fillna(dataset_copy['il_util'].mean(),inplace = True)
dataset_copy['il_util'].isnull().sum()

可以看到此时该列的缺失值的数量为0,填补成功。

接下来对最后一列进行填补。

mths_since_recent_inq列是距离上一次调查的时间(单位是月)。

首先查看该列的众数为多少。

代码语言:javascript
复制
dataset_copy['mths_since_recent_inq'].mode()

可见多数人距上一次贷款调查的时间为一个月左右,此处就用这个值进行填补。

使用fillna()函数进行填补

代码语言:javascript
复制
dataset_copy['mths_since_recent_inq'].fillna(dataset_copy['mths_since_recent_inq'].mode()[0],inplace=True)
dataset_copy['mths_since_recent_inq'].isnull().sum()

缺失值的数量为0,该列填补成功。此时对这四列的简单填补成功,下面介绍一种更加简单的方式来对这四列进行填补。

首先拷贝一份原数据副本,避免再次读取原数据,造成不必要的内存占用。

代码语言:javascript
复制
dataset_copy_2 = dataset.copy()

在前面介绍fillna()函数时,其value参数可以用一个字典进行传入,这样对其四列需要填补的属性来进行一个字典的创建,就可以只需要一个fillna()函数来进行填补了。

首先创建一个字典用于存储填补缺失值所需要传入的字典。

因之前已经计算完毕了填补各列所需的值,此处就直接使用计算得到的值即可。

代码语言:javascript
复制
fill_dict = {
 less_null_index[0]:"workless",
 less_null_index[1]:"5 years",
 less_null_index[2]:dataset_copy_2[less_null_index[2]].mean(),
 less_null_index[3]:dataset_copy_2[less_null_index[3]].mode()[0]
}
print(fill_dict)
代码语言:javascript
复制
dataset_copy_2.fillna(fill_dict,inplace=True)
dataset_copy_2[less_null_index].isnull().sum()

可以发现各列的缺失值数量都为0,填补成功。

2.4 向前向后与插值法进行缺失值的填补

进行前向与后向填补时,也是使用上文介绍的fillna()函数,对该函数中的method参数进行设置,设置为bfill即为后值向前填补,设置为pad即为前值向后填补。

接下来对剩下缺失百分比在3%左右的列进行前后方式以及插值法填补,首先查看缺失百分比在2.5%到4%的列有哪些。

代码语言:javascript
复制
less_null_index = list(na_ratio[(na_ratio['NA_Ratio']<=4) & (na_ratio['NA_Ratio']>=2.5)].index)
print("需要填补的缺失值的列为:",less_null_index)

查看此三列的信息。

代码语言:javascript
复制
dataset_copy[less_null_index].head(5)
代码语言:javascript
复制
dataset_copy[less_null_index].dtypes

next_pymnt_d列是指下一个计划还款日期,对所有缺失值均使用缺失值所在的后一个非缺失值的值来进行填补。

首先简单查看缺失值在该列中的位置,方便之后进行对比,此处选取索引为253到259的几行来作为对比。

代码语言:javascript
复制
dataset_copy['next_pymnt_d'][dataset_copy['next_pymnt_d'].isnull()].head(10)
代码语言:javascript
复制
dataset_copy['next_pymnt_d'][250:265]

可以看到此处有两个缺失值,接下来进行填补,填补完毕之后再查看其效果。

代码语言:javascript
复制
dataset_copy['next_pymnt_d'] = dataset_copy['next_pymnt_d'].fillna(method = "bfill")
dataset_copy['next_pymnt_d'][250:265]

可见填补完毕后,缺失值消失,且均填补为了后值。

此处使用前值向后填补来填补mths_since_rcnt_il列。

mths_since_rcnt_il列的含义是最近分期付款账户开立后的月份时间。

代码语言:javascript
复制
dataset_copy['mths_since_rcnt_il'][dataset_copy['mths_since_rcnt_il'].isnull()].head(10)

同样选取中间部分来方便之后进行对比查看。

代码语言:javascript
复制
dataset_copy['mths_since_rcnt_il'][370:390]
代码语言:javascript
复制
dataset_copy['mths_since_rcnt_il'] = dataset_copy['mths_since_rcnt_il'].fillna(method = "pad")
dataset_copy['mths_since_rcnt_il'][370:390]

填补完毕后,该列不存在缺失值了。

接下来对mo_sin_old_il_acct列使用插值法进行填补。

mo_sin_old_il_acct列代表客户首次开立分期付款账户至今的累计月份数。

代码语言:javascript
复制
dataset_copy['mo_sin_old_il_acct'][dataset_copy['mo_sin_old_il_acct'].isnull()].head(10)

此处选取索引为210到225的行来作为对比查看。

代码语言:javascript
复制
dataset_copy['mo_sin_old_il_acct'][210:225]

简单的删除、填充、替换缺失数据会导致整体数据方差的变化,从而导致数据信息量的变换。使用插值法可解决此问题,即使用interpolate()函数填补缺失值。

该函数的主要参数是method,常见的插入方法包括:linear, time, index, valuesspline等,参数不赋值时默认为线性插入法linear,即用该列数据缺失值前一个数据和后一个数据建立插值直线,然后使用缺失点在线性插值函数的函数值填充该缺失值。对于method参数设置为polynomialspline等,需要设置对应的order参数,代表所使用方法的逼近次数。

该函数的默认值填补是使用了在一个或多个缺失值的前后非空值部分,将其等分填入,即简单的拉格朗日插值法。

代码语言:javascript
复制
dataset_copy['mo_sin_old_il_acct'] = dataset_copy['mo_sin_old_il_acct'].interpolate()
dataset_copy['mo_sin_old_il_acct'][210:225]

接下来对interpolate()函数的更多参数进行介绍。

选取部分列作为备选,方便接下来进行处理。

代码语言:javascript
复制
null_index = list(na_ratio[ (na_ratio['NA_Ratio']>=1) & (na_ratio['NA_Ratio']<2.5) ].index)
print("缺失值列为:",null_index)

interpolate函数中,将method参数设置为polynomial代表多项式插值,进一步将order参数设置为2,代表使用二次多项式插值。

bc_open_to_buy列代表着在循环银行卡上的购买金额,选取503行到510行查看数据。

代码语言:javascript
复制
dataset_copy['bc_open_to_buy'][503:510]

我们使用二次多项式插值法后将其缺失值进行填补。

代码语言:javascript
复制
dataset_copy['bc_open_to_buy'].interpolate(method = "polynomial", order = 2, inplace=True)
dataset_copy['bc_open_to_buy'][503:510]

使用interpolate来进行三次样条插值的方式,将method参数设置为spline,将order参数设置为3

bc_util列代表所有银行卡帐户的当前总余额与信用限额的比例。

选取1129行到1135行来查看数据。

代码语言:javascript
复制
dataset_copy['bc_util'][1129:1135]
代码语言:javascript
复制
dataset_copy['bc_util'].interpolate(method = "spline", order = 3, inplace=True)
dataset_copy['bc_util'][1129:1135]

对剩下的所有列的缺失值进行简单的向前填补处理。

代码语言:javascript
复制
dataset_copy.fillna(method = "bfill",inplace = True)

查看所有数据里面是否还有缺失值。

代码语言:javascript
复制
dataset_copy.isnull().sum().sum()

可见,经过一系列的处理后数据中已经没有缺失值。

在缺失值处理中还有使用模型填补的处理方式,其代表是使用KNN算法对缺失值进行填补。该方法一般适用于在数据集中只有一列或者两列有缺失值的时候,因为较多缺失值进行了填补之后会导致数据本身就存在一定误差,与事实有较大偏离,那么在运算模型的时候,这些填补过的数据列就会产生较大影响,从而使得最后的填补建模以及预测或者回归建模都会存在较大的误差,而只有较少数据列有缺失的时候,此时使用建模方法进行填充就等于使用别的所有的无缺失值的列来预测该存在缺失值的列,从而就转化为了一个建模与预测的问题。除了KNN算法,还有随机森林、GBDT等集成方法可以使用。使用模型进行填补的方法需要用到扩展包Fancyimpute或者Sklearn,其具体做法也与之后的数据建模类似。

2.5 异常值处理

在数据预处理时很容易忽略异常值的处理,因为其发现难度较大。但是异常值的存在是会对模型产生非常大的影响的,所以找到异常值并处理异常值很重要。

处理异常值的过程中,较难的是如何找到,一般来说会绘制箱线图或者该列的折线图来进行异常值的查看,找到异常值后可以有各种方法来对其进行处理,例如直接删除该数据,或者进行各类填补,此处填补方式与缺失值类似就不多介绍,主要介绍如何找到缺失值。

mths_since_rcnt_il列是最近分期付款账户开立后的月份,使用describe函数查看其分布。

代码语言:javascript
复制
dataset_copy['mths_since_rcnt_il'].describe()

可以发现最大值异常的大,有异常值的趋势,但是是否真的符合以及是否只有最大值是异常值还有待进一步挖掘。 故而此处绘制箱线图来查看数据的分布。

导入所需要的包Seaborn。

代码语言:javascript
复制
# 导入包
import seaborn as sns
代码语言:javascript
复制
## 绘图
sns.set(style="whitegrid", color_codes=True)
sns.boxplot(x='mths_since_rcnt_il',data=dataset)
plt.show()

由箱线图可以发现,值在300以上较为分散,且相对别的数据这几个数据较为离群,故而简单的认为对于该列,大于300的均为离群值,即异常值。

查看这些异常值。

代码语言:javascript
复制
dataset_copy['mths_since_rcnt_il'][dataset_copy['mths_since_rcnt_il']>300]

使用drop()函数来删除这些异常值所存在的行。

代码语言:javascript
复制
print("删除异常值之前的行数",len(dataset_copy['mths_since_rcnt_il']))
dataset_copy.drop(list(dataset_copy['mths_since_rcnt_il'][dataset_copy['mths_since_rcnt_il']>300].index),axis = 0,inplace=True)
print("删除异常值之后的行数",len(dataset_copy['mths_since_rcnt_il']))

2.6 重复值处理

一般检测重复数据使用duplicated函数。

代码语言:javascript
复制
## 重置索引
dataset_copy.reset_index(inplace = True)
dataset_copy.drop('index',axis=1,inplace=True)
dataset_copy[dataset_copy.duplicated()]

可见数据中不存在重复值。为了演示重复值检测的方法,此处从数据中随机选取一个行并将其添加到数据中。

代码语言:javascript
复制
random_number = np.random.randint(0,len(dataset_copy['loan_amnt']))
print("随机选择的行为:",random_number)
代码语言:javascript
复制
print("粘贴前的行数为:",len(dataset_copy['loan_amnt']))
duplicated_row = dataset_copy.iloc[random_number]
dataset_copy.loc[len(dataset_copy['loan_amnt'])] = duplicated_row
print("粘贴后的行数为:",len(dataset_copy['loan_amnt']))

此时再使用duplicated()函数来查看重复值。

代码语言:javascript
复制
dataset_copy[dataset_copy.duplicated()]

此时可以看到复制的一行重复值已经被找到。

接下来就是删除重复值,一般使用drop_duplicated()来删除,其参数keep设置为first时,代表删除重复值时保留第一次出现的数据,设置为last时代表删除重复值时保留最后出现的数据,设置为False时代表去除所有重复的数据,inplace代表是否替换原DataFrame

代码语言:javascript
复制
dataset_copy.drop_duplicates(keep='first',inplace=True)
代码语言:javascript
复制
dataset_copy[dataset_copy.duplicated()]

删除完毕后再次调用duplicated()函数来查看重复值,可以发现重复值已经被删除。

3.数据保存

在做完数据清洗后会对新的“好数据”进行存储,以方便之后的建模等工作时可以直接调用。

3.1 Python自带文件写入函数的存储

Python自带的函数写入文件较为简单,首先需要将文件作为对象读取,也就是使用open()函数将文件载入到内存中并创建一个对应的对象,其中第一个字符串代表着文件的路径,第二个w代表是对该文件进行写处理,若为r则代表对该文件进行读处理。

代码语言:javascript
复制
fw = open("./input/output.csv","w")

在创建完毕写入文件对象后,可以使用write()或者writelines()函数将内容传入,二者的区别在于write()函数只能传入字符串对象,而writelines()函数可以传入列表作为写入的内容,需要在列表中添加换行符进行换行。

此处使用write()作为写入的函数使用,此处输出查看传入的字符串参数来检查写入到文件的内容。

首先读取DataFrame的列名,并将其写入到文件的第一行,因为写入文件函数write()的参数需要是一个字符串,所以首先对读取到的列名进行简单的字符串粘贴,且在最后加入转义字符\n进行换行,方便接下来的内容的写入。

因为此处输出的文件是csv格式文件,该文件格式是逗号分隔符,故而需要在每一个不同的列或者内容后面添加逗号用以区分,不同格式文件有不同存储规则,例如txt一般是空格分隔符文件,则需要在不同内容后面加入空格予以区分。

代码语言:javascript
复制
columns = list(dataset_copy.columns)
columns_write = ""
for column in columns:
    columns_write = columns_write+","+column
columns_write = columns_write[1:]
print(columns_write)
fw.write(columns_write+"\n")

写入文件内容,将每一行的内容全部粘贴为一个字符串,再使用write()函数进行写入。

代码语言:javascript
复制
for i in range(0,len(dataset_copy['loan_amnt'])):
    str_write = ""
    for column in columns:
        str_write = str_write+","+str(dataset_copy[column][i])
    str_write = str_write[1:]
    ## 输出查看
    if i<5:
        print(str_write)
    fw.write(str_write+"\n")

无论是读取文件还是写入文件,一旦创建了文件对象则需要对其进行关闭,释放内存。在Python中直接使用close()函数即可。

代码语言:javascript
复制
fw.close()

在Python中提供with方法来简易创建并关闭文件对象的操作。该方法可以不对文件进行一次手动的读取与关闭,该方法会自动关闭文件对象,使得代码更加简单直观。

代码语言:javascript
复制
with open("./input/output.csv","w") as fw:
    columns_write = ""
    ## 写入列名
    for column in columns:
        columns_write = columns_write+","+column
    columns_write = columns_write[1:]
    print(columns_write)
    fw.write(columns_write+"\n")
    ## 写入内容
    for i in range(0,len(dataset_copy['loan_amnt'])):
        str_write = ""
        for column in columns:
            str_write = str_write+","+str(dataset_copy[column][i])
        str_write = str_write[1:]
        ## 输出查看
        if i<3:
            print(str_write)
        fw.write(str_write+"\n")

3.2 Pandas中函数进行文件的存储

在Pandas中,可以直接对格式为DataFrame的数据进行文件的存储。使用Pandas中的to_csv()函数可以进行csv文件的输出,因为不需要写入索引信息,所以此处对index参数设置为False

代码语言:javascript
复制
dataset_copy.to_csv("./input/output.csv",index = False)

Pandas同样支持很多其他格式文件的输出,例如输出txt文件可以将to_csv()函数的sep参数设置为"\s"分隔符。

若想输出excel文件则可以使用to_excel()函数,json文件可使用to_json()函数等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 查看本案例完整的数据、代码和报告请登录数据酷客(http://cookdata.cn)案例板块。
  • 1.数据读取
  • 2.数据清洗
    • 2.1 缺失值的查看
      • 2.2 删除缺失值
        • 2.3 简易填补缺失值
          • 2.4 向前向后与插值法进行缺失值的填补
            • 2.5 异常值处理
              • 2.6 重复值处理
              • 3.数据保存
                • 3.1 Python自带文件写入函数的存储
                  • 3.2 Pandas中函数进行文件的存储
                  相关产品与服务
                  大数据
                  全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档