列操作

本页目录

DataFrame的列操作,包括增、删、改、查,即添加列、插入列、删除列、修改列名、修改列数据、查找列和选择列等。[大谦Excel,dqexcel点com]

直接添加一个新列

【问题描述】

在给定的DataFrame后面添加一个新列。新列的值可以是同一个值,也可以是不同的值。

【示例3-1】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/01 直接添加一个新列/工资表.xlsx”。该文件打开后如图3-1所示,是单位员工的工资信息。要求用pandas导入该Excel文件的数据。在导入的数据最后添加一列“交通补助”,该列的值均为600。输出前5行数据。

Document Image

图3-1 单位员工工资表

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/01 直接添加一个新列/工资表.xlsx。该Excel文件的第一个工作表中A-J列为给定数据。用pandas导入Excel文件的数据,引擎为"openpyxl"。在导入的数据最后添加一列“交通补助”,该列的值均为600。输出前5行数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件,并指定引擎为"openpyxl"
data = pd.read_excel('D:/Samples/ch03/01 列操作/01 直接添加一个新列/工资表.xlsx', engine='openpyxl')
# 添加新列并赋值为600
data['交通补助'] = 600
# 输出前5行数据
print(data.head(5))

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出前5行数据。

code.python
>>> == RESTART: D:/Samples/1.py =
    姓名   部门  基本工资   餐补  其他补贴  应发合计  扣保险  请假  个人所得税  其他扣除  交通补助
0  NM1  行政部  3000  400   NaN  3900  450 NaN    NaN   NaN   600
1  NM2  行政部  4000  400   NaN  3900  450 NaN    NaN   NaN   600
2  NM3  生产部  3500  400   NaN  4400  450 NaN    NaN   NaN   600
3  NM4  生产部  3500  400   NaN  4400  450 NaN    NaN   NaN   600
4  NM5  行政部  3000  400   NaN  3900  450 NaN    NaN   NaN   600

【知识点扩展】

如果每个人的值不一样,可用类似下面的语句,用列表指定每个人的值。注意,列表中值的个数必须等于表中值的行数,否则会出错。

code.python
data['交通补助'] = [600,700,…,600]

已有列简单计算得到新列

【问题描述】

利用已有列数据,通过加、减、乘、除等简单计算得到新列。

【示例3-2】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/02 已有列简单计算得到新列/产品规格.xlsx”。该文件打开后如图3-2所示,是各种产品的长度、宽度和高度等规格数据。用pandas导入该Excel文件的前7行数据。在导入数据的最后添加一个 “体积”列,该列的值通过长乘以宽乘以高得到。

Document Image

图3-2 产品规格数据

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/02 已有列简单计算得到新列/产品规格.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。A-E列分别为“序号”、“物资代码”、“长”、“宽”和“高”。用pandas导入Excel文件的数据,导入前7行数据,引擎为"openpyxl"。在导入的数据最后添加一个 “体积”列,该列的值通过长乘以宽乘以高得到。输出表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件前7行数据,引擎为openpyxl
df = pd.read_excel('D:/Samples/ch03/01 列操作/02 已有列简单计算得到新列/产品规格.xlsx', engine='openpyxl', nrows=7)
# 计算添加体积列
df['体积'] = df['长'] * df['宽'] * df['高']
# 输出表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出添加列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
   序号     物资代码     长     宽     高          体积
0   1  PC02722  2700  2600   700  4914000000
1   2  PC02711  1300   660   900   772200000
2   3  PC02715  2500   900  1650  3712500000
3   4  PC01355  4200   650   650  1774500000
4   5  PC02723  2100   600   900  1134000000
5   6  PC02724  4500   900   950  3847500000
6   7  PC02580  2700  1200   600  1944000000

【知识点扩展】

利用已有列数据通过简单计算得到新列,可以用类似下面的代码直接计算:

code.python
df['总分']=df['语文']+df['数学']+df['外语']+df['政治']+df['历史']

也可以用DataFrame对象的eval方法进行计算,例如

code.python
df.eval('总分=语文+数学+外语+政治+历史',inplace=True)

inplace参数的值设置为True,表示在df的基础上进行修改。如果该参数的值为False,则在df的副本上进行修改,结果对原来的df没有影响。

已有列数据转换得到新列

【问题描述】

与前一问题类似,在已有列的基础上通过数学运算得到一个新列。区别在于数学运算相对更复杂,需要使用函数进行计算。pandas提供了多种函数和方法实现函数计算。

【示例3-3】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/03 已有列数据转换得到新列/点集.xlsx”。该文件打开后如图3-3所示,给定了一列x数据和一列y数据。要求用pandas导入该Excel文件的前10行数据。在导入的数据最后添加一列“z”,该列的值通过函数x^2+y^2得到。

Document Image

图3-3 给定的数据

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/03 已有列数据转换得到新列/点集.xlsx。该Excel文件的第一个工作表中A-B列为给定数据。A-B列分别为“x”和“y”。用pandas导入Excel文件的数据,导入前10行数据,引擎为"openpyxl"。在导入的数据最后添加一列“z”,该列的值通过匿名函数x^2+y^2得到。输出表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取 Excel 文件并选择第一个工作表
df = pd.read_excel('D:/Samples/ch03/01 列操作/03 已有列数据转换得到新列/点集.xlsx', engine='openpyxl', sheet_name=0)
# 取前10行数据
df = df.head(10)
# 新建一列 "z",值为 x^2+y^2 的结果,使用匿名函数
df['z'] = df.apply(lambda row: row['x']**2 + row['y']**2, axis=1)
# 输出表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出添加列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
     序号    x    y     z
0   1.0 -3.0  1.0  17.0
1   2.0 -3.5  1.5  13.5
2   3.0 -3.0  2.0  13.0
3   3.0 -2.5  2.5  12.5
4   5.0 -2.0  3.0  13.0
5   6.0 -1.5  3.5  13.5
6   7.0 -1.0  3.0  17.0
7   8.0 -0.5  3.5  20.5
8   9.0  0.0  5.0  25.0
9  10.0  0.5  5.5  30.5

【知识点扩展】

pandas中用函数转换数据时可以使用匿名函数,也可以使用自定义函数。

  • 匿名函数

如本例所示,使用匿名函数可以转换数据得到新列。下面的例子在基本工资的基础上乘以1.2得到实发工资。这里,函数结合Series对象的apply方法一起使用。

code.python
df['实发工资']=df['基本工资'].apply(lambda x:x*1.2)
  • 自定义函数

可以先将计算公式写成自定义函数的形式,如

code.python
def new_v(x):
    return(x*1.2)

然后将函数作为apply方法的参数指定,实现用函数转换数据。

code.python
df['实发工资']=df['基本工资'].apply(new_v)

函数可以结合Series对象的apply方法、transform方法和map方法,以及DataFrame对象的assign方法等一起使用。下面简单介绍各种方法的语法参数和基本用法。

  • apply方法

Sereis对象的apply方法用func参数指定匿名函数,或者自定义函数的名称,用法如本例代码所示。方法返回一个Sereis对象,表示转换得到的新列或新行。

  • transform方法

Sereis对象的transform方法用func参数指定函数,用axis参数指定列或行,默认时为列,值为1时为行。方法返回一个Sereis对象,表示转换得到的新列或新行。

下面的例子用transform方法实现实发工资=基本工资*1.2的转换。

code.python
df['实发工资']=df['基本工资'].transform(lambda x:x*1.2)
  • map方法

Sereis对象的map方法用arg参数指定函数,用na_action参数指定缺失值的处理方法,值为None或’ignore’。方法返回一个Sereis对象,表示转换得到的新列或新行。

下面的例子用map方法实现实发工资=基本工资*1.2的转换。

code.python
df['实发工资']=df['基本工资'].map(lambda x:x*1.2)
  • assign方法

使用DataFrame对象的assign方法也可以实现数据转换。下面的例子用assign方法实现实发工资与基本工资的转换。

code.python
df=df.assign(实发工资=df['基本工资']*1.2)
df=df.assign(实发工资=lambda x:x.基本工资*1.2)

使用assign方法可以同时添加多个列,如下面同时添加“奖金”列和“实发工资”列。

code.python
df=df.assign(奖金=500,实发工资=lambda x:x.基本工资*1.2)

已有列数据统计得到新列

【问题描述】

根据DataFrame的给定列,使用pandas或NumPy提供的函数和方法通过统计得到新列。统计函数包括求和函数、求均值的函数、求方差的函数等。

【示例3-4】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/04 已有列数据统计得到新列/学生成绩表2.xlsx”。该文件打开后如图3-4所示,是一些同学的不同科目的考试成绩。要求用pandas导入该Excel文件的前13行数据。在导入的数据最后添加一个“总分”列,该列的值为各行成绩数据的和。

Document Image

图3-4 学生成绩表

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/04 已有列数据统计得到新列/学生成绩表2.xlsx。该Excel文件的第一个工作表中A-F列为给定数据。A列为“姓名”,B-F列为各科考试成绩。用pandas导入Excel文件的数据,导入前13行数据,第1列为索引列,引擎为"openpyxl"。在导入的数据最后添加一个“总分”列,该列的值为各行数据的和。输出表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 使用pandas的read_excel方法读取Excel数据文件,sheet_name参数传入工作表名称或索引,使用index_col=0将第1列设置为索引列
xlsx_file = "D:/Samples/ch03/01 列操作/04 已有列数据统计得到新列/学生成绩表2.xlsx"
df = pd.read_excel(xlsx_file, sheet_name=0, index_col=0, engine="openpyxl", nrows=13)
# 使用pandas的sum方法对每一行数据进行求和,axis=1表示按行进行求和
df["总分"] = df.sum(axis=1)
# 输出处理后的表格数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出添加列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
      语文   数学   英语  政治  历史   总分
姓名
王东    16   27   34  13  13  103
徐慧    85   54   92  50  50  331
王慧琴   99   73  118  89  77  456
章思思   95   83   62  49  49  338
阮锦绣   92   91   92  84  74  433
周洪宇   93   92  113  66  66  430
谢思明   98   95  117  73  73  456
程成    98   95  114  70  70  447
王洁   102  102  136  73  72  485
张丽君  107  104  105  59  59  434
马欣   104  112  124  77  66  483
焦明    96  116   99  74  74  459
王艳    88  118  103  87  67  463

【知识点扩展】

通过对已有列进行统计得到新列,可以有以下几种方法:

  • 使用DataFrame对象的统计相关的方法

例如本例中,使用了DataFrame对象的sum方法。

code.python
df["总分"] = df.sum(axis=1)

axis=1,表示对DataFrame的行数据求和。

  • DataFrame对象的apply方法

DataFrame对象的apply方法结合NumPy的统计函数,也可以实现相同的功能,例如:

code.python
df['总分']=df.apply(np.sum,axis=1)

3.DataFrame对象的agg方法

使用DataFrame对象的agg方法,结合pandas提供的聚合函数,同样可以实现对行数据汇总求和。

code.python
df['总分']=df.agg('sum',axis=1)

其中,第一个参数的值’sum’表示求和,axis=1表示求和的方向是对行求和。

根据简单条件得到新列

【问题描述】

根据已有列数据,结合给定的条件得到新列。

【示例3-5】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级.xlsx”。该文件打开后如图3-5所示,是几位同学的学习成绩。现在根据成绩是否及格,将大于等于60分的成绩评定为“通过”,将小于60分的成绩评定为“不通过”,将评定结果放到一个“等级”列。

Document Image

图3-5 学生成绩

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级.xlsx。该Excel文件的第一个工作表中A-B列为给定数据。A列为“姓名”,B列为“成绩”。用pandas导入Excel文件的数据,导入前5行数据,引擎为"openpyxl"。在导入的数据最后添加一列“是否通过”,该列的值用成绩得分,根据以下条件得到:成绩大于等于60时为“通过”,否则为“不通过”。输出表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件前5行数据,引擎为"openpyxl"
file_path = "D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级.xlsx"
df = pd.read_excel(file_path, engine="openpyxl", nrows=5)
# 添加一列“是否通过”,根据成绩得分判断
df["是否通过"] = df["成绩"].apply(lambda x: "通过" if x >= 60 else "不通过")
# 输出表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出添加列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
    姓名  成绩 是否通过
0   张娇  89   通过
1   马燕  75   通过
2  林秀池  97   通过
3   何云  56  不通过
4   周俊  82   通过

根据多级条件得到新列

【问题描述】

根据已有列数据,结合给定的条件得到新列。条件分多个级别。

【示例3-6】

使用示例3-5相同的数据。要求用pandas导入Excel文件的前5行数据。在导入的数据最后添加一个 “等级”列,该列的值用成绩得分,根据以下条件得到:成绩大于等于90时等级为“优秀”,否则成绩大于等于80分时为“良好”,否则大于等于70分时为“中等”,否则大于等于60分时为“及格”,否则为“不及格”。

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级.xlsx。该Excel文件的第一个工作表中A-B列为给定数据。A列为“姓名”,B列为“成绩”。用pandas导入Excel文件的数据,导入前5行数据,引擎为"openpyxl"。在导入的数据最后添加一列“等级”,该列的值用成绩得分,根据以下条件得到:成绩大于等于90时等级为“优秀”,否则成绩大于等于80分时为“良好”,否则大于等于70分时为“中等”,否则大于等于60分时为“及格”,否则为“不及格”。输出表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 使用pandas读取Excel文件中的第一个工作表的数据,引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级.xlsx', engine='openpyxl')
# 取出前5行数据
df_first_five_rows = df.head()
# 添加“等级”列,根据条件对应不同的“等级”
df_first_five_rows['等级'] = pd.cut(df_first_five_rows['成绩'], [0, 59, 69, 79, 89, 100], labels=['不及格', '及格', '中等', '良好', '优秀'])
# 输出添加了“等级”列的数据
print(df_first_five_rows)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出添加列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
    姓名  成绩   等级
0   张娇  89   良好
1   马燕  75   中等
2  林秀池  97   优秀
3   何云  56  不及格
4   周俊  82   良好

【知识点扩展】

本例中用到了pandas的cut函数,该函数常被称为分箱函数。对于本例,

code.python
df_first_five_rows['等级'] = pd.cut(df_first_five_rows['成绩'], [0, 59, 69, 79, 89, 100], labels=['不及格', '及格', '中等', '良好', '优秀'])

函数的第一个参数指定进行分箱的数据为成绩。第二个参数用一个列表指定怎样进行分箱,列表中相邻两个元素定义一个分箱的下界和上界。比如,0和59定义第一个分箱。第三个参数定义各分箱对应的标签。比如,与第一个分箱对应的标签是“不及格”。

根据多列数据组成的条件得到新列

【问题描述】

根据已有多列数据组成条件得到新列。比如判断A列数据是否满足某个条件,或者加上B列数据是否满足另一条件,对C列数据采用不同的计算方法得到新列。

【示例3-7】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级2.xlsx”。该文件打开后如图3-6所示,是多位同学的平时成绩和考试成绩。要求用pandas导入该Excel文件的前5行数据。在导入的数据最后添加一列“最终成绩”,该列的值用平时成绩和成绩,根据以下条件得到:平时成绩大于等于90分时,在成绩的基础上加5分。

Document Image

图3-6 学生的平时成绩和考试成绩

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级2.xlsx。该Excel文件的第一个工作表中A-C列为给定数据。A-C列为“姓名”,“平时成绩”和“成绩”。用pandas导入Excel文件的数据,导入前5行数据,引擎为"openpyxl"。在导入的数据最后添加一列“最终成绩”,该列的值用平时成绩和成绩,根据以下条件得到:平时成绩大于等于90分时,在成绩的基础上加5分。输出表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:

# 导入pandas库

import pandas as pd

# 读取Excel文件数据,第一个工作表,A-C列,引擎为"openpyxl"

df = pd.read_excel('D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级2.xlsx', engine='openpyxl', usecols=['姓名', '平时成绩', '成绩'])

# 获取前5行数据

df_head = df.head(5)

# 定义一个函数,用于根据平时成绩生成最终成绩

def generate_final_score(row):

# 如果平时成绩大于等于90分,则在成绩的基础上加5分,否则最终成绩与成绩相同

if row['平时成绩'] >= 90:

return row['成绩'] + 5

else:

return row['成绩']

# 在导入的数据最后添加一列“最终成绩”,使用apply()方法调用generate_final_score()函数进行计算

df_head['最终成绩'] = df_head.apply(generate_final_score, axis=1)

# 输出表数据

print(df_head)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出添加列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
    姓名  平时成绩  成绩  最终成绩
0   张娇    95  89    94
1   马燕    80  75    75
2  林秀池    92  97   102
3   何云    84  56    56
4   周俊    90  82    87

【知识点扩展】

本例用一个自定义函数定义根据条件计算新列数据的算法,然后用apply方法调用该函数实现计算。也可以用匿名函数实现,如下面代码所示。

code.python
import pandas as pd
# 读取Excel文件中的第一个工作表的前5行数据
data = pd.read_excel('D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级.xlsx', engine='openpyxl', nrows=5)
# 添加最终成绩列
data['最终成绩'] = data.apply(lambda row: row['成绩']+5 if row['平时成绩'] >= 90 else row['成绩'], axis=1)
# 输出表数据
print(data)

根据条件得到新列(mask方法)

【问题描述】

根据已有列数据,结合给定的条件得到新列。使用Series对象的mask方法来实现。

【示例3-8】

使用与示例3-7相同的数据。要求用pandas导入Excel文件的前5行数据。在导入的数据最后添加一个 “最终成绩”列,该列的值用mask方法根据以下条件得到:平时成绩大于等于90分时,在成绩的基础上加5分。

  • ChatGPT提示词模板
  • 新建ChatGPT会话,在提问文本框中输入下面的提示词:
prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级2.xlsx。该Excel文件的第一个工作表中A-C列为给定数据。A-C列为“姓名”,“平时成绩”和“成绩”。用pandas导入Excel文件的数据,导入前5行数据,引擎为"openpyxl"。在导入的数据最后添加一列“最终成绩”,该列的值用Series对象的mask方法,根据以下条件得到:平时成绩大于等于90分时,在成绩的基础上加5分。输出表数据。添加代码注释。
  • ChatGPT提示词模板说明

在提示词中明确指定使用Series对象的mask方法,否则ChatGPT会给出其他解法。

3. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件中第一个工作表的前5行数据
df = pd.read_excel('D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级2.xlsx',
                   engine='openpyxl', sheet_name=0, nrows=5)
# 按照要求添加“最终成绩”列
df['最终成绩'] = df['成绩'].mask(df['平时成绩'] >= 90, df['成绩'] + 5)
# 输出表格数据
print(df)

4. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出添加列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
    姓名  平时成绩  成绩  最终成绩
0   张娇    95  89    94
1   马燕    80  75    75
2  林秀池    92  97   102
3   何云    84  56    56
4   周俊    90  82    87

【知识点扩展】

Series对象的mask方法用第一个参数给出一个条件,条件满足时用第二个参数指定处理方法,条件不满足时Series中的当前值维持原值不变。

例如本例中

code.python
df['最终成绩'] = df['成绩'].mask(df['平时成绩'] >= 90, df['成绩'] + 5)

第一个参数判断平时成绩的当前值是否大于等于90,如果是,则成绩的当前值加5分,否则成绩的当前值维持原值不变。

根据条件得到新列(where方法)

【问题描述】

根据已有列数据,结合给定的条件得到新列。使用Series对象的where方法来实现。

【示例3-9】

使用与示例3-7相同的数据。要求用pandas导入Excel文件的前5行数据。在导入的数据最后添加一个 “最终成绩”列,该列的值用where方法根据以下条件得到:平时成绩大于等于90分时,在成绩的基础上加5分。

  • ChatGPT提示词模板
  • 新建ChatGPT会话,在提问文本框中输入下面的提示词:
prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级2.xlsx。该Excel文件的第一个工作表中A-C列为给定数据。A-C列为“姓名”,“平时成绩”和“成绩”。用pandas导入Excel文件的数据,导入前5行数据,引擎为"openpyxl"。在导入的数据最后添加一列“最终成绩”,该列的值用DataFrame的where方法,根据以下条件得到:平时成绩大于等于90分时,在成绩的基础上加5分。输出表数据。添加代码注释。
  • ChatGPT提示词模板说明

在提示词中明确指定使用Series对象的where方法,否则ChatGPT会给出其他解法。

3. 代码

  • 根据提示词得到类似下面的代码:
code.python
# 导入 pandas 库
import pandas as pd
# 导入 Excel 文件,引擎为 openpyxl,读取第一个工作表
df = pd.read_excel("D:/Samples/ch03/01 列操作/05 根据条件得到新列/成绩等级2.xlsx", sheet_name=0, engine="openpyxl", nrows=5)
# 使用 DataFrame 的 where 方法,在最后一列添加新的数据
df["最终成绩"] = df["成绩"].where(df["平时成绩"] < 90, df["成绩"] + 5)
# 输出所有数据,包含新增的“最终成绩”列
print(df)

4. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出添加列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
    姓名  平时成绩  成绩  最终成绩
0   张娇    95  89    94
1   马燕    80  75    75
2  林秀池    92  97   102
3   何云    84  56    56
4   周俊    90  82    87

【知识点扩展】

Series对象的where方法用第一个参数给出一个条件,条件满足时Series中的当前值维持原值不变,条件不满足时用第二个参数指定处理方法。注意,where方法与mask方法的处理方式是相反的。

例如本例中

code.python
df["最终成绩"] = df["成绩"].where(df["平时成绩"] < 90, df["成绩"] + 5)

第一个参数判断平时成绩的当前值是否小于90,如果不是,则成绩的当前值加5分,否则成绩的当前值维持原值不变。

插入列

【问题描述】

在DataFrame的指定位置插入一个新列。

【示例3-10】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/06 插入列/各部门人员工资.xlsx”。该文件打开后如图3-7所示,是各部门人员的工资信息。要求用pandas导入该Excel文件的前12行数据。在导入的数据中,在第4列前面插入一列“交通补贴”,该列的值均为600。然后给工资总额加600元。

Document Image

图3-7 各部门人员的工资信息

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/06 插入列/各部门人员工资.xlsx。该Excel文件的第一个工作表中A-F列为给定数据。用pandas导入Excel文件的数据,导入前12行数据,引擎为"openpyxl"。在导入的数据中,在第4列前面插入一列“交通补贴”,该列的值均为600。然后给工资总额加600元。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
# 导入pandas库并读取Excel文件的第一个工作表数据(前12行),引擎为openpyxl
import pandas as pd
df = pd.read_excel('D:/Samples/ch03/01 列操作/06 插入列/各部门人员工资.xlsx', sheet_name=0, engine='openpyxl', nrows=12)
# 在第4列前面插入一列“交通补贴”,该列的值均为600
df.insert(loc=3, column='交通补贴', value=600)
# 给工资总额加600元
df['工资总额'] += 600
# 输出修改后的表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出插入列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
     姓名    部门  基本工资  交通补贴   电话补贴   午餐补贴  工资总额
0   黄珊晟  营销中心  7500   600  200.0    NaN  8300
1   刘美妍  营销中心  8000   600  100.0    NaN  8700
2   张兰铭  营销中心  5000   600  100.0    NaN  5700
3   黄军波  营销中心  1500   600  100.0    NaN  2200
4   谭娥娜   市场部  5000   600  200.0    NaN  5800
5   纪淋琳   市场部  3300   600  100.0    NaN  4000
6   江丹娟   市场部  6000   600    NaN    NaN  6600
7   苗滢兰   市场部  5000   600  100.0    NaN  5700
8   张玲娣   市场部  1500   600  100.0    NaN  2200
9   董生蕾   财务部  4000   600  100.0  210.0  4910
10  黄南凤   财务部  3200   600    NaN  150.0  3950
11  廖浩展   财务部  2500   600  100.0  210.0  3410

【知识点扩展】

本例中指定每个人的交通补贴都是600元,如果每个人的交通补贴不一样,可用类似下面的语句,用列表指定每个人的值。注意,列表中值的个数必须等于表中值的行数,否则会出错。

code.python
df.insert(loc=3, column='交通补贴', value=[400,500,…,600])

修改单个列的列名

【问题描述】

修改DataFrame中指定列的列名。

【示例3-11】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/07 修改列名/各分公司业绩.xlsx”。该文件打开后如图3-8所示,是各分公司四个季度的业绩信息。要求用pandas导入该Excel文件的前6行数据。在导入的数据中,将列名“二季度”修改为“第二季度”。

Document Image

图3-8 各分公司业绩

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/07 修改列名/各分公司业绩.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。用pandas导入Excel文件的数据,导入前6行数据,引擎为"openpyxl"。在导入的数据中,将列名“二季度”修改为“第二季度”。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 使用pandas读取Excel文件(前6行数据),引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/01 列操作/07 修改列名/各分公司业绩.xlsx', sheet_name=0, header=0, nrows=6, engine='openpyxl')
# 导入的数据中,将列名“二季度”修改为“第二季度”
df.rename(columns={'二季度': '第二季度'}, inplace=True)
# 输出修改后的表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改列名后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
  公司名称    一季度    第二季度      三季度       四季度
0  A公司  1.800  1.9800  1.38600  1.524600
1  B公司  0.600  0.6600  0.92400  0.739200
2  C公司  0.750  0.8250  0.74250  1.113750
3  D公司  2.275  2.0475  2.66175  3.460275
4  E公司  2.750  2.2000  1.98000  2.574000
5  F公司  0.450  0.5400  0.54000  0.378000

【知识点扩展】

用DataFrame对象的rename方法修改指定列的列名。修改的列名,修改前的名字和修改后的名字组成字典赋给columns参数。修改前的名字为键,修改后的名字为值。设置inplace=True,直接在df的基础上进行修改,而不是在df的副本上修改。

修改多个列的列名

【问题描述】

同时修改DataFrame中多个列的列名。

【示例3-12】

使用示例3-11相同的数据。要求用pandas导入Excel文件的前6行数据。在导入的数据中,将列名“二季度”修改为“第二季度”,将列名“四季度”修改为“第四季度”。

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/07 修改列名/各分公司业绩.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。用pandas导入Excel文件的数据,导入前6行数据,引擎为"openpyxl"。在导入的数据中,将列名“二季度”修改为“第二季度”,将列名“四季度”修改为“第四季度”。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件中第一个工作表的前6行数据,引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/01 列操作/07 修改列名/各分公司业绩.xlsx', engine='openpyxl', sheet_name=0, nrows=6)
# 将列名“二季度”修改为“第二季度”,将列名“四季度”修改为“第四季度”
df.rename(columns={'二季度': '第二季度', '四季度': '第四季度'}, inplace=True)
# 输出修改后的表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改列名后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
  公司名称    一季度    第二季度      三季度      第四季度
0  A公司  1.800  1.9800  1.38600  1.524600
1  B公司  0.600  0.6600  0.92400  0.739200
2  C公司  0.750  0.8250  0.74250  1.113750
3  D公司  2.275  2.0475  2.66175  3.460275
4  E公司  2.750  2.2000  1.98000  2.574000
5  F公司  0.450  0.5400  0.54000  0.378000

【知识点扩展】

用DataFrame对象的rename方法修改多列的列名。修改时,将修改前的名字和修改后的名字组成字典的键值对,多列列名修改就有多个这样的键值对,键值对和键值对之间用逗号间隔,它们一起组成字典。把字典赋给columns参数。inplace=True表示直接在df的基础上进行操作,而不是在df的副本上操作。

给所有列标签添加前缀和后缀

【问题描述】

给DataFrame的所有列的列名添加前缀和(或)后缀。

【示例3-13】

使用示例3-11相同的数据。要求用pandas导入Excel文件的前6行数据。在导入的数据中,给所有列名添加前缀"2022_",添加后缀"_GG"。

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/07 修改列名/各分公司业绩.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。用pandas导入Excel文件的数据,导入前6行数据,引擎为"openpyxl"。在导入的数据中,给所有列名添加前缀"2022_",添加后缀"_GG"。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 加载Excel文件的数据,选择第一个工作表,只导入前6行数据,指定引擎为openpyxl
df = pd.read_excel('D:/Samples/ch03/01 列操作/07 修改列名/各分公司业绩.xlsx', sheet_name=0, nrows=6, engine='openpyxl')
# 遍历所有列名,添加前缀"2022_"和后缀"_GG"
new_columns = []
for col_name in df.columns:
    new_columns.append("2022_" + col_name + "_GG")
# df.columns = [f'2022_{col}_GG' for col in df.columns]
# 将原始列名替换为新列名
df.columns = new_columns
# 输出修改后的表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
2022_公司名称_GG  2022_一季度_GG  2022_二季度_GG  2022_三季度_GG  2022_四季度_GG
0          A公司        1.800       1.9800      1.38600     1.524600
1          B公司        0.600       0.6600      0.92400     0.739200
2          C公司        0.750       0.8250      0.74250     1.113750
3          D公司        2.275       2.0475      2.66175     3.460275
4          E公司        2.750       2.2000      1.98000     2.574000
5          F公司        0.450       0.5400      0.54000     0.378000

【知识点扩展】

给全部列名添加前缀和后缀,本例是通过for循环逐个修改列名,得到一个列表,然后把这个列表赋给DataFrame对象的Columns属性。

实际上,还可以使用DataFrame对象的add_prefix方法和add_suffix方法给全部列名添加前缀和后缀,如下面代码所示。

code.python
df=df.add_prefix('2022_&#x27;)    #添加前缀
df=df.add_suffix('_GG&#x27;)    #添加后缀

下面使用for循环,用DataFrame对象的rename方法给所有列名添加前缀和后缀。

code.python
cn=df.columns
for i in range(len(cn)):
	df.rename(columns={cn[i]:'2022_'+cn[i]+‘_GG’},inplace=True)

下面使用匿名函数给所有列名添加前缀和后缀。

code.python
df.rename(columns=lambda x:'2022_'+x+'_GG',inplace=True)

修改列的数据类型

【问题描述】

修改DataFrame中指定列的数据类型,比如将数字类型改为字符串类型等。

【示例3-14】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/08 修改列的数据类型/产品销售额.xlsx”。该文件打开后如图3-9所示,是一段时间内不同产品的销售清单,包括产品的销售日期、销量和销售额。要求用pandas导入该Excel文件的前5行数据。在导入的数据中,将“订单日期”列数据的数据类型改为字符串类型。

Document Image

图3-9 产品销售清单

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/08 修改列的数据类型/产品销售额.xlsx。该Excel文件的第一个工作表中A-D列为给定数据。用pandas导入Excel文件的数据,导入前5行数据,引擎为"openpyxl"。在导入的数据中,将“订单日期”列数据的数据类型改为字符串类型。输出修改后的表数据以及各列数据的基本数据类型。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 使用pandas读取Excel文件,引擎为"openpyxl"
file_path = 'D:/Samples/ch03/01 列操作/08 修改列的数据类型/产品销售额.xlsx'
df = pd.read_excel(file_path, engine='openpyxl', sheet_name=0, usecols='A:D')
# 取前5行数据
df = df.head()
print(df.dtypes)
# 将“订单日期”列数据的数据类型改为字符串类型
df['订单日期'] = df['订单日期'].astype(str)
# 输出修改后的表数据以及各列数据的基本数据类型
print(df)
print(df.dtypes)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出导入数据的数据类型、修改后的数据以及修改后数据的数据类型。

code.python
>>> == RESTART: D:/Samples/1.py =
订单日期    datetime64[ns]
产品代码            object
数量               int64
销售额              int64
dtype: object
         订单日期   产品代码    数量     销售额
0  2020-10-15  A0001    30    2520
1  2020-11-15  A0003   760  116280
2  2020-11-27  A0001   357   34986
3  2020-12-27  A0001   730   71540
4  2020-11-27  A0004  1520  135280
订单日期    object
产品代码    object
数量       int64
销售额      int64
dtype: object

可见,修改前“订单日期”列的数据类型为datetime64,修改后变成了object,实际上是变成了字符串类型。

【知识点扩展】

使用Series对象的astype方法可以更改列数据的数据类型。例如本例将列数据从日期时间类型改为字符串类型:

code.python
df['订单日期'] = df['订单日期'].astype(str)

用DataFrame对象的dtypes属性获取各列数据的数据类型。注意,这里将日期时间类型修改为字符串类型后用df.dtypes得到的结果,显示转换后为object类型。

经常遇到的情况是,将原始数据用pandas导入进来后,用df.dtypes获取每列数据的数据类型,发现原本应该是数字类型或其他类型的列,显示的数据类型是object,此时就要注意检查原始数据,是否存在输入错误,是否有不规范的输入格式。

注意,DataFrame对象也有astype方法,使用时需要指定列名。下面将df中的“订单日期”列的数据类型修改为字符串类型。

code.python
df=df.astype({'订单日期':'str'})

使用这种方法可一次修改多列。

修改列的数据

【问题描述】

修改DataFrame中已有列的全部数据。

【示例3-11】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/09 修改列的数据/员工信息.xlsx”。该文件打开后如图3-10所示,是某单位部分员工的个人信息。要求用pandas导入该Excel文件的前7行数据。在导入的数据中,将“年龄”列数据加1。

Document Image

图3-10 员工信息

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/09 修改列的数据/员工信息.xlsx。该Excel文件的第一个工作表中A-D列为给定数据。用pandas导入Excel文件的数据,导入前7行数据,引擎为"openpyxl"。在导入的数据中,将“年龄”列数据加1。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件,第一个工作表,前7行数据,引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/01 列操作/09 修改列的数据/员工信息.xlsx', sheet_name=0, nrows=7, engine='openpyxl')
# 将"年龄"列的值加1
df['年龄'] = df['年龄'] + 1
# 输出修改后的表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
    姓名 性别  年龄  省份     职位
0   王力  男  22  江西  品质部助理
1  李思思  女  27  陕西   人事部长
2   李飞  男  26  湖南   人事经理
3   李娜  女  26  广西  采购部经理
4   宋佳  女  20  广东  人事部助理
5  欧阳旭  男  31  河南  ISO主任
6   刘璇  女  42  宁夏  技术部统计

【知识点扩展】

3.1.2~3.1.9小节介绍了利用已有列得到新列的各种方法,实际上,这些方法基本上都可以应用于修改列数据。不同的是,前者得到一个新列,这里是在原有列的基础上进行修改。

例如,下面将df中已有的“实发工资”列的数据乘以1.2。

code.python
df['实发工资']=df['实发工资']*1.2

下面用Series对象的apply方法和匿名函数一起实现。

code.python
df['实发工资']=df['实发工资'].apply(lambda x:x*1.2)

下面用Series对象的transform方法和匿名函数一起实现。

code.python
df['实发工资']=df['实发工资'].transform(lambda x:x*1.2)

另外,还可以用Series对象的update方法修改列数据。比如,下面用update方法将“实发工资”列的所有数据更新为指定数据。

code.python
df['实发工资'].update(pd.Series([5000,8000,6000,10000]))

下面用update方法将“实发工资”列的第1个和第4个数据更新为指定数据。

code.python
df['实发工资'].update(pd.Series([5000,8000],index=[0,3]))

DataFrame对象也有update方法,下面定义两个DataFrame,即df1和df2,使用update方法,用df2更新df1。

code.python
df1=pd.DataFrame({'A':[1,2,3],'B':[20,30,40]})
df2=pd.DataFrame({'B':[4,5,6],'C':[8,9,10]})
df1.update(df2)

此时会用df2中的”B”列数据更新df1中的”B”列数据。

修改列数据的格式

【问题描述】

修改DataFrame中列数据的格式,比如指定数字的小数位数、日期时间格式等。

【示例3-16】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/10 修改列数据的格式/求函数值.xlsx”。该文件打开后如图3-11所示,有”x”和”y=x2”两列数据。要求用pandas导入该Excel文件的前5行数据。在导入的数据中,将“y=x2”列数据修改为保留4位小数。

Document Image

图3-11 修改列数据的格式

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/10 修改列数据的格式/求函数值.xlsx。该Excel文件的第一个工作表中A-B列为给定数据。用pandas导入Excel文件的数据,导入前5行数据,引擎为"openpyxl"。在导入的数据中,将“y=x2”列数据修改为保留4位小数。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件数据,选择第一个工作表,导入前5行数据,引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch03/01 列操作/10 修改列数据的格式/求函数值.xlsx', sheet_name=0, nrows=5, engine='openpyxl')
# 将“y=x2”列数据修改为保留4位小数
df["y=x2"] = df["y=x2"].round(4)
# 输出修改后的表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改格式后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
     X    y=x2
0 -3.0  0.0625
1 -3.5  0.0884
2 -3.0  0.1250
3 -2.5  0.1768
4 -2.0  0.2500

【知识点扩展】

本例使用Series对象的round方法直接指定小数位数。此外,也可以使用apply方法和map方法等指定数据格式。

下面的代码将“y=x2”列数据的格式修改为保留2位小数的百分位数。

code.python
import pandas as pd
# 读取Excel文件前5行数据,引擎为openpyxl
data = pd.read_excel("D:/Samples/ch03/01 列操作/10 修改列数据的格式/求函数值.xlsx", engine="openpyxl", sheet_name=0, nrows=5)
# 将“y=x2”列数据修改为保留2位小数的百分位数
data["y=x2"] = data["y=x2"].apply(lambda x: '{:.2%}'.format(x))
# 输出修改后的表数据
print(data)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改格式后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
     X    y=x2
0 -3.0   6.25%
1 -3.5   8.84%
2 -3.0  12.50%
3 -2.5  17.68%
4 -2.0  25.00%

也可以用Series对象的map方法指定数据格式,例如将“y=x2”列数据的格式修改为保留4位小数。

code.python
df[' y=x2']=df[' y=x2'].map('{:.4f}'.format)

将“y=x2”列数据的格式修改为保留2位小数的百分位数。

code.python
df[' y=x2']=df[' y=x2'].map('{:.2%}'.format)

列的字符串数据改为数字

【问题描述】

数字才能计算,经常需要将DataFrame中某列的字符串数据修改为数字。

【示例3-17】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/11 列的字符串数据改为数字/男裤库存.xlsx”。该文件打开后如图3-12所示,是一批男裤的库存信息。要求用pandas导入该Excel文件的前5行数据。在导入的数据中,将“大小”列中的字符串数据按照下面的规则修改为数字:"S"改为1,"M"改为2,"L"改为3,"XL"改为4,"XXL"改为5。

Document Image

图3-12 男裤库存信息

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/11 列的字符串数据改为数字/男裤库存.xlsx。该Excel文件的第一个工作表中A-D列为给定数据。用pandas导入Excel文件的数据,导入前5行数据,引擎为"openpyxl"。在导入的数据中,将“大小”列中的字符串数据按照下面的规则修改为数字:"S"改为1,"M"改为2,"L"改为3,"XL"改为4,"XXL"改为5。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件中的第一个工作表中前5行数据,引擎为"openpyxl"
data = pd.read_excel("D:/Samples/ch03/01 列操作/11 列的字符串数据改为数字/男裤库存.xlsx", engine="openpyxl", sheet_name=0, nrows=5)
# 将“大小”列按照规则映射为数字,并更新到原数据中
size_mapping = {"S": 1, "M": 2, "L": 3, "XL": 4, "XXL": 5}
data["大小"] = data["大小"].map(size_mapping)
# 输出修改后的表数据
print(data)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
    产品代码  颜色  大小    库存
0  A0001  白色   4    30
1  A0001  白色   3   760
2  A0001  白色   2   357
3  A0001  白色   1   730
4  A0001  黑色   2  1520

【知识点扩展】

替换列数据常常使用Series对象的map方法,此时map方法的参数设置为一个字典,字典中各键值对中的键为要修改的数据,值为修改后的数据。可以一次修改多个数据。

下面的例子将“性别”列中的“男”修改为1,将“女”修改为0。

code.python
df['性别']=df['性别'].map({'男':1,'女':0})

根据条件修改数据

【问题描述】

3.1.5~3.1.9小节介绍了根据条件得到一个新列的各种方法。使用这些方法,同样可以修改已有列的数据。区别在于前者是新建一个列,后者是对已有列进行修改。

【示例3-18】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/12 根据条件修改数据/人员工资.xlsx”。该文件打开后如图3-13所示,是一些人员的工资信息。要求用pandas导入该Excel文件的前9行数据。在导入的数据中,给年龄大于等于45岁的人员的工资加300元。

Document Image

图3-13 人员工资表

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/12 根据条件修改数据/人员工资.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。用pandas导入Excel文件的数据,导入前9行数据,引擎为"openpyxl"。在导入的数据中,给年龄大于等于45岁的人员的工资加300元。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件
path = 'D:/Samples/ch03/01 列操作/12 根据条件修改数据/人员工资.xlsx'
df = pd.read_excel(path, engine='openpyxl', sheet_name=0, usecols='A:E', nrows=9)
# 找到年龄大于等于45岁的人员,并将其工资加300元
df.loc[df['年龄'] >= 45, '工资'] += 300
# 输出修改后的表数据
print(df)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出修改后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
      编号 性别  年龄 职务等级    工资
0  1000145  正处级  4600
1  1000242   科员  3800
2  1000329  正处级  3600
3  1000440  副局级  4400
4  1000555  副局级  4800
5  1000635  正处级  4100
6  1000723   科员  3500
7  1000836   科员  3700
8  1000950  正局级  5100

【知识点扩展】

可以使用Series对象的mask方法和where方法修改已有列的数据。

下面的代码给df中“A”列里面大于等于2的数据加10.

code.python
df['A']=df['A'].mask(df['A'].ge(2),df['A']+10)

下面用where方法实现同样的效果。

code.python
df['A']=df['A'].where(df['A'].lt(2),df['A']+10)

注意,使用where方法时,条件不满足时用第2个参数提供的方法进行处理,这与mask方法的处理相反。

删除列

【问题描述】

删除DataFrame中的指定列。

【示例3-19】

本例使用的Excel文件的完整路径为“D:/Samples/ch03/01 列操作/13 删除列/工资表.xlsx”。该文件打开后如图3-14所示,是一些员工的工资表。要求用pandas导入Excel文件的前5行数据。在导入的数据中,删除“实发工资”列。

Document Image

图3-14 员工工资表

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/01 列操作/13 删除列/工资表.xlsx。该Excel文件的第一个工作表中A-E列为给定数据。用pandas导入Excel文件的数据,导入前5行数据,引擎为"openpyxl"。在导入的数据中,删除“实发工资”列。输出修改后的表数据。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd #导入pandas模块
#读取Excel文件数据
data = pd.read_excel('D:/Samples/ch03/01 列操作/13 删除列/工资表.xlsx', engine='openpyxl', sheet_name=0, nrows=5)
#删除"实发工资"列
data = data.drop('实发工资', axis=1)
#输出修改后的表数据
print(data)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出删除指定列后的数据。

code.python
>>> == RESTART: D:/Samples/1.py =
   序号   姓名    岗位  基本工资   加班费  6-10月高温费  应发工资   水电扣减  个社/商保扣减
0   1   陈芳  保安班长  1310  1360        50  2720  13.53    10.00
1   2  王亚军  日班保安  1310   960        50  2320  13.53    10.00
2   3   文卿    电工  1310   990        50  2350  13.53   263.92
3   4  李梦元  夜班保安  1310   490        50  1850    NaN    10.00
4   5  王志祥  夜班保安  1310   490        50  1850    NaN    10.00

【知识点扩展】

使用drop方法删除列。用columns参数指定要删除的列的列名,如果同时删除多列,将这些列的列名放到一个列表中指定给labels参数。用axis参数指定删除行还是删除列。

注意,这里axis=1时表示删除的是列,axis=0时表示删除的是行。在有的函数和方法中,axis=0指示列,axis=1指示行,正好与此相反。

下面的代码删除df中的“实发工资”列数据。

code.python
df.drop(columns="实发工资",inplace=True, axis=1)

注意,inplace=True表示直接在df的基础上进行修改。如果不设置该参数,也可以通过将drop方法返回的DataFrame赋给df来实现,即

code.python
df=df.drop(columns="实发工资",axis=1)