基于公共列col1合并DataFrame并保留重复行的高效实现方案
高效实现DataFrame基于单列的批量关联填充
问题场景
现有df1如下:
import pandas as pd index = [0, 1, 2, 3] columns = ['col0', 'col1'] data = [['A', 'D'], ['B', 'E'], ['C', 'F'], ['A', 'D'] ] df1 = pd.DataFrame(data, index, columns)
输出:
col0 col1 0 A D 1 B E 2 C F 3 A D
现有df2如下:
index = [0, 1] columns = ['col1', 'col2', 'col3'] data = [['D', 'XX', 'YY'], ['E', 'XXX', 'YYY'] ] df2 = pd.DataFrame(data, index, columns)
输出:
col1 col2 col3 0 D XX YY 1 E XXX YYY
需求说明:
需基于col1列关联df1与df2,将df2的col2、col3值填充到df1对应行,无匹配项则填充NaN。df1含大量重复行(实际数据141000行),要求高效实现,禁用iterrows()这类低效率方法,长度匹配时的合并逻辑不适用当前场景。
期望得到的df3:
index = [0, 1, 2, 3] columns = ['col0', 'col1', 'col2', 'col3'] data = [['A', 'D', 'XX', 'YY'], ['B', 'E', 'XXX', 'YYY'], ['C', 'F', 'nan', 'nan'], ['A', 'D', 'XX', 'YY'] ] df3 = pd.DataFrame(data, index, columns)
输出:
col0 col1 col2 col3 0 A D XX YY 1 B E XXX YYY 2 C F nan nan 3 A D XX YY
Pandas 高效解决方案
直接使用pd.merge左连接,指定关联键为col1即可,该方法为向量化操作,效率远高于循环遍历:
df3 = pd.merge(df1, df2, on='col1', how='left')
此方法会自动处理df1中的重复行,只要col1匹配就填充对应值,无匹配则填充NaN,完全满足需求,处理14万行数据无压力。
若df2存在重复的col1值,可先对df2去重,保留每个col1的唯一记录:
df2_unique = df2.drop_duplicates(subset='col1', keep='first') df3 = pd.merge(df1, df2_unique, on='col1', how='left')
PySpark 解决方案
针对超大规模数据,PySpark处理更高效,逻辑与Pandas一致:
from pyspark.sql import SparkSession # 初始化SparkSession spark = SparkSession.builder.appName("JoinExample").getOrCreate() # 转换为Spark DataFrame df1_spark = spark.createDataFrame(df1) df2_spark = spark.createDataFrame(df2) # 左连接关联 df3_spark = df1_spark.join(df2_spark, on='col1', how='left') # 查看结果 df3_spark.show()
若df2有重复col1值,先去重再关联:
df2_spark_unique = df2_spark.dropDuplicates(['col1']) df3_spark = df1_spark.join(df2_spark_unique, on='col1', how='left')
内容的提问来源于stack exchange,提问作者Strayhorn
相关产品推荐
相关产品推荐

