值操作

DataFrame的值操作包括单个值的修改、局部区域中值的修改和全部值的修改等内容。

修改单个值

【问题描述】

修改DataFrame中单个的值。

【示例3-26】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/03 值操作/01 修改单个值/生产辅料.xlsx”。该文件打开后如图3-17所示,是各种生产辅料的资料。要求用pandas导入Excel文件的前5行数据。在导入的数据中,将第2行的“预算数量”列数据修改为1500。

Document Image

图3-17 生产辅料资料

  • ChatGPT提示词模板

新建ChatGPT会话,在提问文本框中输入下面的提示词:

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/03 值操作/01 修改单个值/生产辅料.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。用pandas导入Excel文件的数据,导入前5行,引擎为"openpyxl"。在导入的数据中,将第2行的“预算数量”列数据修改为1500。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
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窗口输出修改后的数据。

code.python
>>> == 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。

Document Image

图3-18 sku明细

  • ChatGPT提示词模板

新建ChatGPT会话,在提问文本框中输入下面的提示词:

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/03 值操作/02 修改局部区域内的值/sku明细.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。用pandas导入Excel文件的数据,导入前5行,引擎为"openpyxl"。在导入的数据中,将第2行,“加购件数”列和“支付件数”列的数据修改为2800,700,将第3行,“加购件数”列和“支付件数”列的数据修改为2000,800。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
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窗口输出修改后的数据。

code.python
>>> == 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

【知识点扩展】

本例中因为提示词表述的原因,修改数据时是将指定区域中的数据逐行进行修改。实际上,可以一次完成修改,如下所示。

code.python
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。

Document Image Document Image

  • (a) (b)

图3-19 值操作数据

  • ChatGPT提示词模板

新建ChatGPT会话,在提问文本框中输入下面的提示词:

prompt
你是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. 代码

  • 根据提示词得到类似下面的代码:
code.python
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后的结果。

code.python
>>> == 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中的每个值修改为该值的平方。

code.python
df=df.applymap(lambda x:x**2)

下面用applymap方法设置值的格式为保留2位小数。

code.python
df=df.applymap('{:.2f}'.format)