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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:52:21