如何在Pandas中将含日期字符串的多行表头转为列值
数据规整实现方案:提取日期并整理表格列
需求说明
需要将原始表格中PI No.列内的日期字符串提取为独立的Date列,同时规整其他列的数据,去除无效空行,最终得到结构清晰的目标表格。
实现步骤(基于Python Pandas)
以下是具体的代码实现和逻辑说明:
- 导入依赖并加载数据
先把给定的字典数据转换成Pandas的DataFrame:
import pandas as pd import numpy as np # 原始数据字典 raw_data = { "PI No.": { 0: "Date :03/31/2023", 1: "009331", 2: "009331", 3: "Date :03/30/2023", 4: "009323", 5: "Date :03/29/2023", 6: "009302", 7: "009302", }, "GRN No.": { 0: np.nan, 1: 19614.0, 2: 19614.0, 3: np.nan, 4: 19603.0, 5: np.nan, 6: 19576.0, 7: 19576.0, }, "Supplier Name": { 0: np.nan, 1: "Supplier 1", 2: "Supplier 1", 3: np.nan, 4: "Supplier 2", 5: np.nan, 6: "Supplier 1", 7: "Supplier 2", }, "Item": { 0: np.nan, 1: "Item 1", 2: "Item 2", 3: np.nan, 4: "Item 2", 5: np.nan, 6: "Item 1", 7: "Item 2", }, } df = pd.DataFrame(raw_data)
- 提取并填充Date列
从PI No.列中识别包含Date的行,提取日期部分,然后用向前填充(ffill)把日期传递给下方对应的行:
# 提取日期字符串,非日期行设为NaN df['Date'] = df['PI No.'].str.extract(r'Date\s*:(.*)') # 向前填充,让下方行继承上方的日期 df['Date'] = df['Date'].ffill()
- 清理PI No.列并过滤空行
只保留PI No.列中的纯编号(去掉带Date的行),然后过滤掉所有列都是空值的无效行:
# 保留不是日期的PI编号,其他设为NaN df['PI No.'] = df['PI No.'].where(~df['PI No.'].str.contains('Date', na=False)) # 过滤掉PI No.为空的行(即原来的日期行) df = df.dropna(subset=['PI No.']).reset_index(drop=True)
- 调整列顺序
把Date列移到最前面,符合目标表格的结构:
# 重新排列列顺序 df = df[['Date', 'PI No.', 'GRN No.', 'Supplier Name', 'Item']]
最终效果
运行上述代码后,得到的DataFrame就和目标表格结构一致,输出结果如下:
| Date | PI No. | GRN No. | Supplier Name | Item |
|---|---|---|---|---|
| 03/31/2023 | 009331 | 19614.0 | Supplier 1 | Item 1 |
| 03/31/2023 | 009331 | 19614.0 | Supplier 1 | Item 2 |
| 03/30/2023 | 009323 | 19603.0 | Supplier 2 | Item 2 |
| 03/29/2023 | 009302 | 19576.0 | Supplier 1 | Item 1 |
| 03/29/2023 | 009302 | 19576.0 | Supplier 2 | Item 2 |
内容的提问来源于stack exchange,提问作者wekular
相关产品推荐
相关产品推荐

