如何用Pandas解析DataFrame指定列单元格并重构数据格式?
高效解析Excel列并重构DataFrame的Python方案
问题背景
你已经用Pandas从Excel中提取指定列生成了DataFrame,代码如下:
import pandas as pd from pandas import ExcelWriter xls_file = pd.ExcelFile('seedtestexcelbytask.xls') writer = ExcelWriter('DFExport.xls') df = xls_file.parse(usecols=[2, 3, 15])
你的DataFrame示例(整理后更易读):
2 3 15 0 True 2/2/18 Seed 2 2in Holon, 83/1/2 1 True 2/3/18 Seed 1 1in Holon, 83/5 2 True 2/5/18 Seed 2 1.5in Holon, 26/1/2, 21/2, RW/1/2, H/7
核心需求是:保留列3的日期值,解析列15的复杂内容,提取其中特定格式的片段,拆分后结合日期生成新行,最终输出类似这样的结构:
2/2/18 83 1 2/2/18 83 2 2/3/18 83 5 2/5/18 26 1 2/5/18 26 2 2/5/18 21 2 2/5/18 RW 1 2/5/18 RW 2 2/5/18 H 7
高效实现思路
不用低效的嵌套循环或iterrows(),我们可以用Pandas的矢量化操作+正则表达式来处理,全程利用Pandas的内置高效方法,步骤如下:
- 用正则从列15中批量提取所有符合
XX/X或XX/X/X格式的片段 - 把每个日期对应的提取片段列表拆分成多行(用
explode方法) - 根据片段的格式(是否有第三个元素),生成对应数量的目标行
完整代码实现
import pandas as pd import re # 读取数据(和你原代码一致) xls_file = pd.ExcelFile('seedtestexcelbytask.xls') df = xls_file.parse(usecols=[2, 3, 15]) # 重命名列,避免数字列名的操作麻烦 df = df.rename(columns={3: 'date', 15: 'content'}) # 正则表达式:匹配所有需要拆分的片段,比如83/1/2、21/2、RW/1/2 pattern = re.compile(r'([A-Za-z0-9]+)/([0-9]+)(?:/([0-9]+))?') # 1. 提取每行content中的所有匹配片段,生成列表 df['matches'] = df['content'].apply(lambda x: pattern.findall(x)) # 2. 把列表拆分成多行,每个片段对应一行(高效替代循环) df_exploded = df.explode('matches').reset_index(drop=True) # 3. 将匹配到的元组拆分成单独列 df_exploded[['code', 'num1', 'num2']] = pd.DataFrame( df_exploded['matches'].tolist(), index=df_exploded.index ) # 4. 根据片段格式生成目标行:XX/X/X生成两行,XX/X生成一行 def expand_rows(row): date = row['date'] code = row['code'] num1 = row['num1'] num2 = row['num2'] if num2 is not None: # 有第三个元素,生成两行 return pd.Series([(date, code, num1), (date, code, num2)]) else: # 只有两个元素,生成一行 return pd.Series([(date, code, num1)]) # 应用函数并展开成最终结构 final_df = df_exploded.apply(expand_rows, axis=1).stack().reset_index(drop=True) final_df = pd.DataFrame(final_df.tolist(), columns=['date', 'code', 'number']) # 输出符合要求的格式,或保存到Excel print(final_df.to_string(index=False, header=False)) final_df.to_excel('DFExport.xls', index=False, header=False)
关键步骤解释
- 正则表达式:精准匹配你需要的片段,分组提取出代码、数字1、可选的数字2,避免手动拆分字符串的繁琐。
- explode方法:Pandas专门用于将列表型列拆分成多行的高效工具,比手动循环快几个数量级。
- 矢量化操作:全程用Pandas的内置方法处理,避免逐行循环,处理大数据量时优势非常明显。
内容的提问来源于stack exchange,提问作者azryel6500
相关产品推荐
相关产品推荐

