如何用Pandas将多行合并为一行并按指定Num值分配列
需求说明
现有如下格式的CSV文件(记为CSV A):
Date/Time Num 2023/04/10 14:13:18 6122 2023/04/10 14:14:24 6005 2023/04/10 14:14:59 6004
该文件最多包含3行数据,且必定存在Num=6122的行,Num=6005和6004的行可能存在或缺失。需要将其合并为单行,列规则如下:
- Num=6005对应的
Date/Time和Num放入Date/Time_1、Num_1列 - Num=6004对应的
Date/Time和Num放入Date/Time_2、Num_2列 - 若对应行缺失,则对应列留空
示例输出(完整数据时):
Date/Time Num Date/Time_1 Num_1 Date/Time_2 Num_2 2023/04/10 14:13:18 6122 2023/04/10 14:14:24 6005 2023/04/10 14:14:59 6004
仅存在Num=6004时的输出:
Date/Time Num Date/Time_1 Num_1 Date/Time_2 Num_2 2023/04/10 14:13:18 6122 2023/04/10 14:14:59 6004
Pandas实现代码
import pandas as pd # 读取CSV文件,用正则匹配任意空格作为分隔符,适配原文件格式 df = pd.read_csv('input.csv', sep='\s+') # 初始化结果字典,先固定填充Num=6122的基础数据 result = { 'Date/Time': df.loc[df['Num'] == 6122, 'Date/Time'].values[0], 'Num': 6122, 'Date/Time_1': '', 'Num_1': '', 'Date/Time_2': '', 'Num_2': '' } # 检查并填充Num=6005对应的列 if 6005 in df['Num'].values: target_row = df.loc[df['Num'] == 6005] result['Date/Time_1'] = target_row['Date/Time'].values[0] result['Num_1'] = 6005 # 检查并填充Num=6004对应的列 if 6004 in df['Num'].values: target_row = df.loc[df['Num'] == 6004] result['Date/Time_2'] = target_row['Date/Time'].values[0] result['Num_2'] = 6004 # 转换为单行DataFrame并输出(去掉索引保持格式一致) output_df = pd.DataFrame([result]) print(output_df.to_string(index=False)) # 若需保存为CSV文件,可执行以下代码(用制表符分隔保证列对齐) # output_df.to_csv('output.csv', index=False, sep='\t')
代码说明
- 读取文件时使用
sep='\s+',适配原文件的多空格分隔格式,避免列识别错误 - 先提取固定存在的Num=6122行数据作为结果基础
- 通过判断目标数值是否在数据中,分别填充对应列内容,缺失则保留空值
- 输出时用
to_string(index=False)去掉索引,保证和示例格式匹配
内容的提问来源于stack exchange,提问作者RKIDEV
相关产品推荐
相关产品推荐

