You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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的内置高效方法,步骤如下:

  1. 用正则从列15中批量提取所有符合XX/X或XX/X/X格式的片段
  2. 把每个日期对应的提取片段列表拆分成多行(用explode方法)
  3. 根据片段的格式(是否有第三个元素),生成对应数量的目标行

完整代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:53:23