如何在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))
代码说明
- 分组划分:通过定位所有
t行的索引,将数据划分为多个独立的分组,每个分组对应一个分隔符到下一个分隔符之间的内容。 - 逐组处理:
- 先将当前分隔符行加入结果列表
- 提取分组内的
e行,合并C2和C3的数值并去重,确保保留原始出现顺序 - 根据去重后的数值生成
v行,序号从1开始递增 - 最后将原
e行加入结果列表
- 结果拼接:将所有处理后的行拼接成新的DataFrame,完成需求。
适配调整
- 如果原数据中C2、C3为数值类型,可将
str(seq_num)改为整数seq_num - 超大数据集可考虑分块处理,避免内存占用过高
内容的提问来源于stack exchange,提问作者Fortides
相关产品推荐
相关产品推荐

