分列是将给定的文本按照一定的规则进行分割成不同的部分,有使用单一分隔符分列、多分隔符分列和按照固定宽度分列等情况。[大谦Excel,dqexcel点com]
用分隔符分列
【问题描述】
用单一分隔符对指定文本进行分列。
【示例5-3】
本例使用的Excel文件的完整路径为“D:/Samples/ch05/03 用分隔符分列/分割物质规格.xlsx”。该文件打开后如图5-3所示,要求将“规格”列的数据用分隔符*分为3列,对应的列索引分别为”长“、”宽“和”高“。
图5-3 用单一分隔符分列
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch05/03 用分隔符分列/分割物质规格.xlsx。用pandas导入第1个工作表中的数据,第1行为索引行,导入前7行数据,引擎为"openpyxl"。将规格中的数据用分隔符*分为3列,对应的列索引分别为”长“、”宽“和”高“。添加代码注释。
2. 代码
- 根据提示词得到类似下面的代码:
import pandas as pd
# 定义文件路径
file_path = 'D:/Samples/ch05/03 用分隔符分列/分割物质规格.xlsx'
# 使用pandas读取excel文件第一个工作表中的数据,引擎为"openpyxl",第一行作为索引行
df = pd.read_excel(file_path, sheet_name=0, index_col=0, engine='openpyxl', nrows=7)
# 将规格数据按照*分隔成三个部分,对应的列索引分别为”长“、”宽“和”高“
df[['长', '宽', '高']] = df['规格'].str.split('*', expand=True)
# 打印导入的数据
print(df.head())
3. 使用代码
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出分列结果。
>>> == RESTART: D:/Samples/1.py =
物资代码 物资名称 规格 单位 长 宽 高
序号
1 WJPC02722 防水布袋 2700*2600*700 个 2700 2600 700
2 WJPC02711 防水布袋 1300*660*900 件 1300 660 900
3 WJPC02715 防水布袋 2500*900*1650 件 2500 900 1650
4 WJPC01355 防水布袋 4200*650*650 件 4200 650 650
5 WJPC02723 防水布袋 2100*600*900 个 2100 600 900
6 WJPC02724 防水布袋 4500*900*950 个 4500 900 950
7 WJPC02580 防水布袋 2700*1200*600 件 2700 1200 600
【知识点扩展】
pandas中使用split函数用单一分隔符对指定文本进行分列。用pat参数指定分隔符或正则表达式,用n参数表示分割次数。默认时分隔符为空格。
下面的代码用分列的方法解决示例5-1。
import pandas as pd
# 读取Excel文件中的第1个工作表中的第1列"籍贯"数据
df = pd.read_excel('D:/Samples/ch05/00 提取子文本/提取省市县.xlsx', sheet_name=0, usecols=[0], engine='openpyxl')
# 定义一个函数用于提取省份或自治区、市或自治州、县或区
def extract_region(text):
# 提取出省份或自治区
province = text.split('省')[0] + '省' if '省' in text else text.split('自治区')[0] + '自治区'
# 提取出市或自治州
temp_text = text.split(province)[1] # 去掉省份或自治区部分的文本
city = temp_text.split('市')[0] + '市' if '市' in temp_text else temp_text.split('自治州')[0] + '自治州'
# 提取出县或区
temp_text = temp_text.split(city)[1] # 去掉市或自治州部分的文本
county = temp_text.split('县')[0] + '县' if '县' in temp_text else temp_text.split('区')[0] + '区'
return province, city, county
# 对DataFrame中的每个数据应用extract_region函数,获取省份或自治区、市或自治州、县或区
df[['省(自治区)', '市(自治州)', '县(区)']] = pd.DataFrame(df['籍贯'].apply(lambda x: extract_region(x)).tolist(), index=df.index)
# 打印处理后的DataFrame
print(df)
用多种分隔符分列
【问题描述】
可以指定多种分隔符实现分列。
【示例5-4】
本例使用的Excel文件的完整路径为“D:/Samples/ch05/04 用多种分隔符分列/员工生日.xlsx”。该文件打开后如图5-4所示,要求对出生日期字符串数据,将字符“年”和“月”用作分隔符进行分列,注意分列得到的最后一部分去掉最后一个字符。
图5-4 人员出生日期数据
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch05/04 用多种分隔符分列/员工生日.xlsx。用pandas导入第1个工作表中的数据,导入前2列"姓名"和“出生日期”数据,引擎为"openpyxl"。对出生日期字符串数据,将字符“年”和“月”用作分隔符,进行分列,注意分列得到的最后一部分去掉最后一个字符。分列的结果添加到导入数据右侧。添加代码注释。
2. 代码
- 根据提示词得到类似下面的代码:
import pandas as pd
# 导入Excel文件中第1个工作表中的数据(前2列)
data = pd.read_excel('D:/Samples/ch05/04 用多种分隔符分列/员工生日.xlsx', sheet_name=0, usecols=[0, 1], engine='openpyxl')
# 对“出生日期”字符串进行分列,分别以“年”和“月”作为分隔符
birth_cols = data['出生日期'].str.split('[年月]', expand=True)
# 分裂出的每个部分的最后一个字符都不属于日期,需要去掉
birth_cols[2] = birth_cols[2].str[:-1]
# 将出生日期分裂出来的列添加到原始数据中
data = pd.concat([data, birth_cols], axis=1)
# 打印结果
print(data.head())
3. 使用代码
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出分列结果。
>>> == RESTART: D:/Samples/1.py =
姓名 出生日期 0 1 2
0 张三 1997年2月16日 1997 2 16
1 李四 1998年9月10日 1998 9 10
2 王二 1996年12月6日 1996 12 6
3 秦风 1999年1月21日 1999 1 21
4 赵棉 1998年10月23日 1998 10 23
固定宽度分列
【问题描述】
指定固定宽度对文本进行分列。
【示例5-5】
本例使用的Excel文件的完整路径为“D:/Samples/ch05/05 固定宽度分列/手机信息.xlsx”。该文件打开后如图5-5所示,要求对手机信息进行固定宽度分列,第1-11个字符为手机号,第12-13个字符为运行商,第14-16个字符为省份,第17到18个字符为市。
图5-5 手机信息
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch05/05 固定宽度分列/手机信息.xlsx。用pandas导入第1个工作表中的数据,导入第1列“手机信息”数据,引擎为"openpyxl"。对手机信息进行固定宽度分列,第1-11个字符为手机号,第12-13个字符为运行商,第14-16个字符为省份,第17到18个字符为市。分列的结果添加到导入数据右侧。添加代码注释。
2. 代码
- 根据提示词得到类似下面的代码:
import pandas as pd
# 读取文件
file_path = 'D:/Samples/ch05/05 固定宽度分列/手机信息.xlsx'
df = pd.read_excel(file_path, engine='openpyxl', sheet_name=0)
# 分列
df[['手机号','运营商','省份','市']] = df['手机信息'].str.extract('(\\d{11})(\\w{2})(\\w{3})(\\w{2})')
# 输出结果
print(df)
3. 使用代码
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出分列结果。
>>> == RESTART: D:/Samples/1.py =
手机信息 手机号 运营商 省份 市
0 18303517744移动山西省太原 18303517744 移动 山西省 太原
1 13613416611移动山西省太原 13613416611 移动 山西省 太原
2 15219466201移动广东省深圳 15219466201 移动 广东省 深圳
3 15036222256移动河南省南阳 15036222256 移动 河南省 南阳
4 18438888133移动河南省南阳 18438888133 移动 河南省 南阳
5 13715150077移动广东省深圳 13715150077 移动 广东省 深圳
6 13717033838移动广东省深圳 13717033838 移动 广东省 深圳
7 18351078990移动江苏省苏州 18351078990 移动 江苏省 苏州
8 15997693333移动湖北省宜昌 15997693333 移动 湖北省 宜昌