如何合并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
相关产品推荐
相关产品推荐

