电商客户价值细分 - RFM 模型(上)

3.1数据的读取与写入

在我们日常生活中,除了csv格式的文件外,我们更多会使用文件名后缀为'.xlsx',包含多个工作表的Excel文件。

对这列文件进行数据分析的过程中,同样少不了数据的读取和写入操作。

那么,是否有类似read_csv()、to_csv()的函数的函数,可以对工作簿文件进行数据的操作呢?

答案是有的,pandas库提供了read_excel()函数读取Excel数据,一级to_excel()函数讲数据写入到Excel文件。

2.1.1 read_excel函数

首先是read_excel()函数,他能够以DataFrame格式读取Excel文件的数据,并返回一个DataFrame对象。

使用该函数可以用到两个参数:io和sheet_name.

(1)参数io传入的是Excel文件路径或文件对象。例如'test.xlsx'

(2)参数sheet_name传入的是Excel文件的工作表名称,默认为第一个工作表'Sheet1'。

# 打开【成绩单.xlsx】工作簿,并获取【1 班】工作表的数据
data_1 = pd.read_excel('./工作/成绩单.xlsx', sheet_name='1 班')
data_1

上面的代码中,我们调用函数read_excel()读取工作簿数据时,给参数io掺入工作路径'./工作/成绩单.xlsx'; 给参数 sheet_name 传入工作表名 '1 班'

2.1.2 to_excel() 函数

to_excel() 函数可以以 DataFrame 格式将数据写入到 Excel 文件。同样可以看看该函数的语法:

 使用该函数可以用到三个参数:excel_writersheet_name 和 index

1)参数 excel_writer 同样传入的是 Excel 文件路径或文件对象;
2)参数 sheet_name 有些不同,传入的是新建 Excel 文件的工作表名称,默认为新建工作表 'Sheet1'
3)参数 index 用于决定是否在写入时加上数据的行索引,默认为 True,即往文件中写入行索引。设置为 False 则不写入行索引。

# 创建一个 DataFrame 对象的数据
data_2 = pd.DataFrame({'学号':[1, 2, 3], '性别':['男', '男', '女'], '年龄':['17', '17', '16'], '总分':['285', '273', '240']})
data_2

 如果想要创建一个工作表名为【2 班】的工作簿【新成绩单.xlsx】,并将创建的 DataFrame 数据写入到该工作表,可以通过下方的代码来实现:

# 将数据写入到【新成绩单.xlsx】工作簿中的【2 班】工作表
data_2.to_excel('新成绩单.xlsx', sheet_name='2 班', index=False)

将 to_excel() 函数的参数 index 设置为 False,目的是不把行索引也写入到工作簿中。

 因为 Excel 表中默认有行索引。

 

如果数据的行索引在工作簿中不具备参考价值,建议不写入到工作簿中。

代码运行完后,虽然没有任何数据的显示,但是我们确实将数据写入到 Excel 文件。此时读取【新成绩单.xlsx】工作簿的【2 班】工作表,可以读取到我们刚刚写入的数据。

# 打开【新成绩单.xlsx】工作簿,并获取【2 班】工作表的数据
data_3 = pd.read_excel('新成绩单.xlsx', sheet_name='2 班')
data_3

 

# 创建一个 DataFrame 对象的数据
data_4 = pd.DataFrame( {
    '学号':[1, 2, 3], 
    '性别':['女', '女', '女'], 
    '年龄':['15', '18', '16'], 
    '总分':['290', '288', '269']
})
# 将数据写入到【汇总成绩单.xlsx】工作簿中的【汇总】工作表
data_4.to_excel('汇总成绩单.xlsx',sheet_name='汇总',index=False)

3.2 数据的类型转换

有一个 DataFrame 对象的数据是这样的👇,包含不同科目的分数,其中语文和数学是整数类型,但是英语成绩却是字符串类型:

# 创建一个 DataFrame 对象的数据
data_5 = pd.DataFrame({'姓名':['林某某', '许放羊', '王鱼'], '语文': [87, 82, 67], '数学':[73, 85, 90], '英语':['89', '95', '95']})
data_5

 假如想要新建一个【总分】列,用来存储每个人三门科目的总分。原本是可以直接运行

# 计算每个人三门科目的总分
data_5['总分'] = data_5['语文'] + data_5['数学'] + data_5['英语']

 

程序运行后报错了,TypeError: unsupported operand type(s) for +: 'int' and 'str',整数类型与字符串类型不能运算。

这说明【英语】列的字符串类型数据,不能直接与其它两列的分数进行加法计算。

这就要求我们调整【英语】列的数据类型,使得三列的数据类型都为整数或者浮点型,才能进行求和操作。

好在 Python 提供了一个 astype() 方法,该方法可以将 Series/DataFrame 对象转换为指定的数据类型。

astype() 方法中的参数 dtype,我们可以为其赋上需要的数据类型,如 int、str 等。

 

其中,由于参数 dtype 是 astype() 方法的第一个位置参数,所以我们在使用时无需写为 astype(dtype=int),可以直接写为 astype(int)

现在我们来使用 astype() 方法解决上面的问题。

已知【英语】列的数据类型为字符串类型,其它两列的数据类型为整数型。那我们只需要将【英语】列的数据类型转换为整数型。

# 计算每个人三门科目的总分
data_5['总分'] = data_5['语文'] + data_5['数学'] + data_5['英语'].astype(int)
data_5

 可以看到,新建的【总分】列成功记录了每个人的科目总分。

假设有一个 DataFrame 对象的数据是这样的:

# 创建一个 DataFrame 对象的数据
data_6 = pd.DataFrame({'商品名':['猪头皮', '醋', '高压锅'], '单价': [10, 13, 800], '数量':['5', '2', '1']})
data_6

 提示:
1)总额 = 单价 x 数量
2)要注意观察不同数值的数据类型

# 新建【总额】列,列内容为每样商品的总额
data_6['总额'] = data_6['单价']*data_6['数量'].astype(int)
data_6

 

由于【数量】列的数据为字符串类型,【单价】列的数据为整数型。

所以在代码中,我们可以将【数量】列的数据转换为整数型,再对数据进行计算。

3.3 数据的批量替换

有时我们读取数据时,会发现数据里存在一些错误信息。如下图中的“山头市”:

 

为了确保数据的准确性,我们需要对这些错别字进行批量修改,替换为正确的内容。

此时我们可以使用 replace() 方法对 Series/DataFrame 对象的数据实现批量替换的操作。

先来看看 replace() 方法的语法结构。

 replace() 方法中的参数 to_replace 可以是一个字典,字典可以将指定的列数据替换为不同的值。

# 创建一个 DataFrame 对象的数据
data_7 = pd.DataFrame({'性别':['难', '女', '难', '女', '女'],
                       '城市':['.', '潮州市', '山头市', '汕尾市', '山头市'],
                       '年龄':[25, 26, 24, 25, 26],
                       '爱好':['蓝球', '跑步', '跳舞', '逛街', '读书']})
data_7

如果要将上方数据中【城市】列的值“山头市”,以及【爱好】列的值“蓝球”,分别替换为“汕头市”、“篮球”。

我们可以设置一个字典 fix_typo = {'山头市':'汕头市', '蓝球':'篮球'},再将该字典放入 replace() 方法里

# 定义字典 fix_typo
fix_typo = {'山头市':'汕头市', '蓝球':'篮球'}
# 对【城市】、【爱好】列的错字进行修改
data_7 = data_7.replace(fix_typo)
data_7

 

上方的代码会根据 replace() 内的参数内容,对整个 DataFrame 对象的数据进行批量替换。

如果只想对指定某一列的数据进行替换,比如只替换【城市】列的数据,可如下实现。

# 定义字典 fix_typo
fix_typo = {'山头市':'汕头市', '蓝球':'篮球'}
# 对【城市】列的错字进行修改
data_7['城市'] = data_7['城市'].replace(fix_typo)
data_7

 代码中,我们通过 data_7['城市'] 指定【城市】列,再根据字典中所设置的内容,使用 replace() 方法将该列的数据进行批量替换。

从显示的结果可以看到,【爱好】列的“蓝球”没有被修改为“篮球”,原因是我们只指定【城市】列,所以其它列的数据不会被替换。

根据上面的数据,可以看到【性别】列中存在错别字“难”,需要将其改为“男”。而【城市】列出现了一个未知含义的“.”,需要将其改为“未知”。

# 将【性别】列的“难”替换为“男”,【城市】列的“.”替换为“未知”
test={'.':'未知','难':'男'}
data_7.replace(test)

 

# 将【性别】列的“难”替换为“男”
data_7['性别'] = data_7['性别'].replace({'难':'男'})
# 将【城市】列的“.”替换为“未知”
data_7['城市'] = data_7['城市'].replace({'.':'未知'})
data_7

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mez_Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值