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

如何在Pandas DataFrame中按规则提取并插入特定数值行

处理带分隔符的Pandas DataFrame数据需求

问题背景

从txt文件导入的Pandas DataFrame结构如下,其中以t # {i}行作为分隔,每行分隔符下方是若干e开头的数据行:

C1  C2      C3      C4
     t # 0 
e   10001   252207  CAT
    t # 1       
e   100018  219559  DOG
    t # 2       
e   100068  251102  CAT
...
    t # 10000   
e   200194  550979  COW
e   200194  565072  COW

需要实现以下操作:

  • 提取相邻分隔符行之间所有e行的C2、C3数值,去重后按原顺序插入到对应分隔符行的下方
  • 插入的行需满足:C1为v,C3是从1开始的递增序号,C4为空
  • 原e行保持不变

导入数据的代码:

with open("results123.txt", "r") as f:
    text = [line.split() for line in f]

import pandas as pd
df = pd.DataFrame(
    text,
    columns=['C1','C2','C3','C4']
)

解决方案

通过分组标记、逐组处理的方式实现需求,代码如下:

import pandas as pd

# 保持原数据导入逻辑
with open("results123.txt", "r") as f:
    text = [line.split() for line in f]
df = pd.DataFrame(text, columns=['C1','C2','C3','C4'])

# 获取所有分隔符行(C1为't')的索引,添加末尾边界索引
t_indices = df[df['C1'] == 't'].index.tolist()
t_indices.append(len(df))

result = []

for i in range(len(t_indices) - 1):
    # 添加当前分隔符行到结果
    t_row = df.loc[t_indices[i]].copy()
    result.append(t_row)
    
    # 提取当前分隔符到下一个分隔符之间的所有'e'行
    start_idx = t_indices[i] + 1
    end_idx = t_indices[i+1]
    e_group = df.loc[start_idx:end_idx-1]
    e_group = e_group[e_group['C1'] == 'e']
    
    # 合并C2、C3的数值,去重并保留原始顺序
    unique_vals = pd.concat([e_group['C2'], e_group['C3']]).drop_duplicates(keep='first').tolist()
    
    # 生成需要插入的'v'行
    for seq_num, val in enumerate(unique_vals, start=1):
        v_row = pd.Series({
            'C1': 'v',
            'C2': val,
            'C3': str(seq_num),
            'C4': None
        })
        result.append(v_row)
    
    # 添加原'e'行到结果
    result.extend(e_group.to_dict('records'))

# 转换为最终DataFrame并重置索引
final_df = pd.DataFrame(result).reset_index(drop=True)

# 查看结果示例
print(final_df.head(15))

代码说明

  1. 分组划分:通过定位所有t行的索引,将数据划分为多个独立的分组,每个分组对应一个分隔符到下一个分隔符之间的内容。
  2. 逐组处理:
    • 先将当前分隔符行加入结果列表
    • 提取分组内的e行,合并C2和C3的数值并去重,确保保留原始出现顺序
    • 根据去重后的数值生成v行,序号从1开始递增
    • 最后将原e行加入结果列表
  3. 结果拼接:将所有处理后的行拼接成新的DataFrame,完成需求。

适配调整

  • 如果原数据中C2、C3为数值类型,可将str(seq_num)改为整数seq_num
  • 超大数据集可考虑分块处理,避免内存占用过高

内容的提问来源于stack exchange,提问作者Fortides

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:52:05