DataFrame的值操作包括单个值的修改、局部区域中值的修改和全部值的修改等内容。
修改单个值
【问题描述】
修改DataFrame中单个的值。
【示例3-26】
本例使用的Excel文件的完整路径为“D:/Samples/ch03/03 值操作/01 修改单个值/生产辅料.xlsx”。该文件打开后如图3-17所示,是各种生产辅料的资料。要求用pandas导入Excel文件的前5行数据。在导入的数据中,将第2行的“预算数量”列数据修改为1500。
图3-17 生产辅料资料
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch03/03 值操作/01 修改单个值/生产辅料.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。用pandas导入Excel文件的数据,导入前5行,引擎为"openpyxl"。在导入的数据中,将第2行的“预算数量”列数据修改为1500。输出修改后的表数据。添加代码注释。
2. 代码
- 根据提示词得到类似下面的代码:
import pandas as pd
# 读取Excel文件
file_path = 'D:/Samples/ch03/03 值操作/01 修改单个值/生产辅料.xlsx'
df = pd.read_excel(file_path, sheet_name=0, engine="openpyxl")
# 将第2行“预算数量”列的值修改为1500
df.loc[1, '预算数量'] = 1500
# 输出修改后的表数据
print(df.head(5))
3. 使用代码
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改后的数据。
>>> == RESTART: D:/Samples/1.py =
序号 物料编码 辅料名称 计量单位 预算数量
0 1 501300-00219 控制电缆 米 4600
1 2 501300-00236 控制电缆 米 1500
2 4 501600-00002 沉头螺钉 个 20000
3 5 502200-00284 环保焊锡丝 卷 10
4 6 500307-00124 管状预绝缘端头 个 11500
修改局部区域内的值
【问题描述】
修改DataFrame中局部区域的值。
【示例3-27】
本例使用的Excel文件的完整路径为“D:/Samples/ch03/03 值操作/02 修改局部区域内的值/sku明细.xlsx”。该文件打开后如图3-18所示,是一些产品的销售信息。要求用pandas导入该Excel文件的前5行数据。在导入的数据中,将第2行,“加购件数”列和“支付件数”列的数据修改为2800, 700,将第3行,“加购件数”列和“支付件数”列的数据修改为2000, 800。
图3-18 sku明细
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch03/03 值操作/02 修改局部区域内的值/sku明细.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。用pandas导入Excel文件的数据,导入前5行,引擎为"openpyxl"。在导入的数据中,将第2行,“加购件数”列和“支付件数”列的数据修改为2800,700,将第3行,“加购件数”列和“支付件数”列的数据修改为2000,800。输出修改后的表数据。添加代码注释。
2. 代码
- 根据提示词得到类似下面的代码:
import pandas as pd
# 指定文件路径和工作表名称,使用openpyxl引擎读取Excel文件数据
df = pd.read_excel("D:/Samples/ch03/03 值操作/02 修改局部区域内的值/sku明细.xlsx", sheet_name="Sheet1", engine="openpyxl")
# 修改第2行和第3行"加购件数"和"支付件数"列的数据
df.loc[1, ["加购件数", "支付件数"]] = [2800, 700]
df.loc[2, ["加购件数", "支付件数"]] = [2000, 800]
# 输出修改后的数据
print(df.head(5))
3. 使用代码
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改后的数据。
>>> == RESTART: D:/Samples/1.py =
日期 sku名称 加购件数 支付金额 支付件数 支付买家数
0 3月 尺码:均码;颜色分类:白色 2940 120617.41 848 825
1 3月 尺码:均码;颜色分类:军绿色 2800 93659.76 700 647
2 3月 尺码:均码;颜色分类:军绿色 2000 117580.50 800 700
3 3月 尺码:均码;颜色分类:天蓝色 1614 54098.61 388 368
4 3月 尺码:均码;颜色分类:深蓝色 1590 82468.99 377 307
【知识点扩展】
本例中因为提示词表述的原因,修改数据时是将指定区域中的数据逐行进行修改。实际上,可以一次完成修改,如下所示。
df.loc[[1,2],["加购件数", "支付件数"]]=[[2800, 700],[2000, 800]]
修改所有值
【问题描述】
修改DataFrame中所有的值。
【示例3-28】
本例使用的Excel文件的完整路径为“D:/Samples/ch03/03 值操作/03 修改所有值/值操作.xlsx”。该文件打开后如图3-19所示,图(a)和图(b)中分别为工作表Sheet1和Sheet2中的数据。要求用pandas导入Excel文件中第一个工作表的数据到df1;导入第二个工作表中的数据到df2。给df1的每个数据加10,得到df3。给df1的每行数据加上[10 20 30],得到df4。将df1和df2相加,得到df5。
- (a) (b)
图3-19 值操作数据
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch03/03 值操作/03 修改所有值/值操作.xlsx。用pandas导入Excel文件中第一个工作表的数据到df1,第1行为索引行,没有索引列,导入前3行前3列,引擎为"openpyxl";导入第二个工作表中的数据到df2,第1行为索引行,没有索引列,导入前3行前3列,引擎为"openpyxl"。给df1的每个数据加10,得到df3,输出df3。给df1的每行数据加上[10 20 30],得到df4,输出df4。将df1和df2相加,得到df5,输出df5。添加代码注释。
2. ChatGPT提示词模板说明
指定df1和df2,有利于后面更清晰的表达。
3. 代码
- 根据提示词得到类似下面的代码:
import pandas as pd
file_path = 'D:/Samples/ch03/03 值操作/03 修改所有值/值操作.xlsx'
# 读取第一个工作表前3行前3列的数据到df1
df1 = pd.read_excel(file_path, sheet_name=0, header=0, index_col=None, usecols='A:C', nrows=3, engine='openpyxl')
# 读取第二个工作表前3行前3列的数据到df2
df2 = pd.read_excel(file_path, sheet_name=1, header=0, index_col=None, usecols='A:C', nrows=3, engine='openpyxl')
# 给df1中的每个数据加上10,得到df3
df3 = df1 + 10
print(df3)
# 给df1的每行数据加上[10 20 30],得到df4
df4 = df1.apply(lambda x: x + [10, 20, 30], axis=1)
print(df4)
# 将df1和df2相加,得到df5
df5 = df1 + df2
print(df5)
4. 使用代码
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出通过计算修改df1后的结果。
>>> == RESTART: D:/Samples/1.py =
x y z
0 13 17 46
1 22 15 18
2 19 33 20
x y z
0 13 27 66
1 22 25 38
2 19 43 40
x y z
0 8 14 37
1 24 13 24
2 34 32 20
可见,给一个DataFame加上一个标量,相当于DataFrame中的每个值都加上这个标量;给一个DataFame加上一个行向量,相当于DataFrame中的每个行都加上这个行向量;给一个DataFame加上一个列向量,相当于DataFrame中的每个列都加上这个列向量;给一个DataFame加上另一个相同大小的DataFrame,相当于两个DataFrame中的对应值相加得到新的DataFrame。
【知识点扩展】
本例中使用了DataFrame大小的apply方法实现数据的修改。实际上,修改DataFrame中全部数据更常用的是applymap方法。
如下面的语句用applymap方法结合匿名函数将df中的每个值修改为该值的平方。
df=df.applymap(lambda x:x**2)
下面用applymap方法设置值的格式为保留2位小数。
df=df.applymap('{:.2f}'.format)