如何使用Python Pandas将TXT文件中关联多行文本合并为单行?
Pandas实现土壤描述行合并解决方案
问题说明
原始TXT文件内容(分隔符为|):
140037|1|TOP SOIL DARK BROWN CLAY RICH ORGANIC|0|0.8 140037|2|MATER SOFT|| 140037|3|SANDY CLAY SOFT MOTTLED GREY/ORANGE|0.8|1 140037|4|BROWN <15% SAND GRAINS|| 140037|5|CLAY MOTTLED DARK GREY/ORANGE BROWN|1|3 140037|6|SOFT BECOMING FIRM MINOR SILT AND|| 140037|7|FINE SAND IN SOME LAYERS||
需要合并为:
140037|1|TOP SOIL DARK BROWN CLAY RICH ORGANIC MATER SOFT|0|0.8 140037|2|SANDY CLAY SOFT MOTTLED GREY/ORANGE BROWN <15% SAND GRAINS|0.8|1 140037|3|CLAY MOTTLED DARK GREY/ORANGE BROWN SOFT BECOMING FIRM MINOR SILT AND FINE SAND IN SOME LAYERS|1|3
实现步骤及代码
读取文件并处理空值
用pd.read_csv读取文件,指定分隔符为|,将空字符串转为NaN便于后续判断:import pandas as pd # 读取文件,设置分隔符为|,空字符串转为NaN df = pd.read_csv('your_file.txt', sep='|', header=None, na_values=[''], dtype=str) # 给列命名方便操作 df.columns = ['ID', 'Line_No', 'Description', 'Val1', 'Val2']创建分组键
规律:每组起始行的Val1和Val2不为空,后续行是补充描述且这两列为空。用Val1.notna()标记起始行,通过cumsum()生成唯一分组ID:# 生成分组键:起始行标记为True,累加后得到每个组的唯一ID df['Group_ID'] = df['Val1'].notna().cumsum()分组聚合合并
按Group_ID分组,合并Description列(空格连接),Val1和Val2取每组第一个非空值,ID取组内一致值,重新生成Line_No:# 分组聚合 merged_df = df.groupby('Group_ID').agg( ID=('ID', 'first'), Line_No=('Group_ID', lambda x: str(x.iloc[0])), # 重新生成Line_No Description=('Description', lambda x: ' '.join(x.dropna())), Val1=('Val1', 'first'), Val2=('Val2', 'first') ).reset_index(drop=True)输出结果
将合并后的DataFrame转为指定格式的文本:# 保存为TXT文件,用|分隔,空值转为空字符串 merged_df.to_csv('merged_result.txt', sep='|', header=False, index=False, na_rep='')
执行上述代码后即可得到目标格式的文件。
内容的提问来源于stack exchange,提问作者ZYLUO
相关产品推荐
相关产品推荐

