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

Pandas DataFrame中逐行合并多列(含文本与非文本)的优化方法

优雅合并Pandas中混合类型多列并做预处理的方案

嘿,这个需求太典型了——我也经常遇到要把混合类型的列合并成文本,还要加预处理的场景。你原来用循环拼接的方法虽然能跑通,但确实不够优雅,而且数据量大的时候效率会明显拉胯。咱们来聊聊几种更符合Pandas风格的解决方案:

1. 用agg快速实现基础合并

这是最简洁的写法,直接对指定列按行聚合,把每个元素转成字符串后用空格连接:

import pandas as pd

# 示例DataFrame与列名
df = pd.DataFrame({
    'text_col': ['Hello', 'World'],
    'num_col': [123, 456],
    'bool_col': [True, False]
})
text_cols = ['text_col', 'num_col', 'bool_col']

# 合并列并生成新列
df['combined_text'] = df[text_cols].agg(lambda x: ' '.join(str(val) for val in x), axis=1)

这里axis=1指定按行处理,生成器表达式str(val) for val in x会把每行的每个元素(不管是数字、布尔值还是文本)都转成字符串,再用空格拼接成完整文本。

2. 抽离预处理逻辑的灵活方案

如果需要对每个元素做预处理(比如去除多余空格、过滤空值、替换特殊字符),把逻辑抽成单独函数会更清晰:

def process_and_merge(row):
    processed_segments = []
    for cell in row:
        # 这里添加你的预处理逻辑,比如去空格、过滤空内容
        segment = str(cell).strip()
        # 可选:跳过空字符串,避免出现连续空格
        if segment:
            processed_segments.append(segment)
    return ' '.join(processed_segments)

df['combined_text'] = df[text_cols].apply(process_and_merge, axis=1)

这种方式扩展性极强,不管是加正则替换、大小写转换还是其他清洗逻辑,都能轻松塞进函数里。

3. 为什么你原来的代码会得到字符数组?

你之前写的:

for i in range(len(df)):
    text = df.loc[i, text_cols].apply(lambda x: ' '.join(str(x)))

问题出在apply的作用对象上——这里的df.loc[i, text_cols]是一行数据,但默认apply是按列处理元素的,而且' '.join(str(x))会把单个字符串的每个字符用空格拆分(比如str(123)变成"123",join后就是"1 2 3"),最后返回的是每列处理后的结果,自然是一个字符数组啦。

效率对比

你原来的逐行loc循环属于Python级别的遍历,当DataFrame有上万行甚至更多时,速度会比agg/apply慢很多——因为Pandas的这些方法底层是用C优化过的,能大幅减少循环开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:24:57