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

如何合并Pandas中互为镜像的两列并生成目标新列?

解决Pandas镜像列生成统一id的问题

嘿,你说的没错,pivot_table()确实不适合这个场景——我们不需要做聚合,而是要根据type的取值条件性地提取src或dest的值来生成新的id列。下面给你几个简单高效的实现方法,都是实战里常用的:

方法一:用numpy.where()(首推,性能拉满)

这是处理条件赋值最直接的向量化方法,速度特别快,大数据量下优势明显:

import pandas as pd
import numpy as np

# 先构造你的原始数据
raw_data = {
    'src': [1, 1, 1, 1, 2, 3, 4, 5],
    'dest': [2, 3, 4, 5, 1, 1, 1, 1],
    'type': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
    'time': [76, 176, 276, 376, 211, 321, 422, 523]
}
df = pd.DataFrame(raw_data)

# 核心:根据type生成id列
df['id'] = np.where(df['type'] == 'A', df['dest'], df['src'])

# 调整列顺序匹配目标格式(可选)
result_df = df[['id', 'type', 'time']]
print(result_df)

运行后输出的结果完全符合你的目标格式,而且这个方法比行级循环快N倍,强烈推荐。

方法二:用DataFrame.apply()(逻辑直观,适合小数据)

如果你更习惯行级处理的写法,也可以用apply(),不过性能不如向量化方法,适合数据量不大的场景:

df['id'] = df.apply(lambda row: row['dest'] if row['type'] == 'A' else row['src'], axis=1)

方法三:布尔索引分步赋值(逻辑清晰,易理解)

分两步给id列赋值,新手也能一眼看懂逻辑:

# 先默认把id设为src的值
df['id'] = df['src']
# 对type为A的行,把id替换成dest的值
df.loc[df['type'] == 'A', 'id'] = df['dest']

这三种方法都能完美实现你的需求,优先选第一种numpy.where()就对了。生成id列之后,如果后续要对同一个id的A/B记录做配对或者统计,直接用groupby('id')就能轻松处理啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:46:46