分列

分列是将给定的文本按照一定的规则进行分割成不同的部分,有使用单一分隔符分列、多分隔符分列和按照固定宽度分列等情况。[大谦Excel,dqexcel点com]

用分隔符分列

【问题描述】

用单一分隔符对指定文本进行分列。

【示例5-3】

本例使用的Excel文件的完整路径为“D:/Samples/ch05/03 用分隔符分列/分割物质规格.xlsx”。该文件打开后如图5-3所示,要求将“规格”列的数据用分隔符*分为3列,对应的列索引分别为”长“、”宽“和”高“。

Document Image

图5-3 用单一分隔符分列

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch05/03 用分隔符分列/分割物质规格.xlsx。用pandas导入第1个工作表中的数据,第1行为索引行,导入前7行数据,引擎为"openpyxl"。将规格中的数据用分隔符*分为3列,对应的列索引分别为”长“、”宽“和”高“。添加代码注释。

2. 代码

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

code.python
>>> == RESTART: D:/Samples/1.py =
         物资代码  物资名称             规格 单位     长     宽     高
序号
1   WJPC02722  防水布袋  2700*2600*7002700  2600   700
2   WJPC02711  防水布袋   1300*660*9001300   660   900
3   WJPC02715  防水布袋  2500*900*16502500   900  1650
4   WJPC01355  防水布袋   4200*650*6504200   650   650
5   WJPC02723  防水布袋   2100*600*9002100   600   900
6   WJPC02724  防水布袋   4500*900*9504500   900   950
7   WJPC02580  防水布袋  2700*1200*6002700  1200   600

【知识点扩展】

pandas中使用split函数用单一分隔符对指定文本进行分列。用pat参数指定分隔符或正则表达式,用n参数表示分割次数。默认时分隔符为空格。

下面的代码用分列的方法解决示例5-1。

code.python
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所示,要求对出生日期字符串数据,将字符“年”和“月”用作分隔符进行分列,注意分列得到的最后一部分去掉最后一个字符。

Document Image

图5-4 人员出生日期数据

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch05/04 用多种分隔符分列/员工生日.xlsx。用pandas导入第1个工作表中的数据,导入前2列"姓名"和“出生日期”数据,引擎为"openpyxl"。对出生日期字符串数据,将字符“年”和“月”用作分隔符,进行分列,注意分列得到的最后一部分去掉最后一个字符。分列的结果添加到导入数据右侧。添加代码注释。

2. 代码

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

code.python
>>> == 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个字符为市。

Document Image

图5-5 手机信息

  • ChatGPT提示词模板

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

prompt
你是pandas专家,文件路径为:D:/Samples/ch05/05 固定宽度分列/手机信息.xlsx。用pandas导入第1个工作表中的数据,导入第1列“手机信息”数据,引擎为"openpyxl"。对手机信息进行固定宽度分列,第1-11个字符为手机号,第12-13个字符为运行商,第14-16个字符为省份,第17到18个字符为市。分列的结果添加到导入数据右侧。添加代码注释。

2. 代码

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

code.python
>>> == 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  移动  湖北省  宜昌