如何合并含数组的DataFrame:匹配trackedSearchId关联分组信息
关联两个DataFrame:基于数组匹配关联字段
Pandas 实现方案
核心思路是先将DF2中包含数组的列拆分为多行,再与DF1进行左连接,确保DF1的每一行都能匹配到对应的分组信息。
- 构造示例数据
import pandas as pd df1 = pd.DataFrame({ 'isActive': [True, False, True], 'trackedSearchId': ['id1', 'id2', 'id3'] }) df2 = pd.DataFrame({ 'trackedSearchIds': [['id1', 'id3'], ['id2']], 'Primary Keyword Group(s)': ['Group A', 'Group B'] })
- 拆分DF2的数组列
将trackedSearchIds数组展开为单独行,同时保留对应的分组信息:
df2_expanded = df2.explode('trackedSearchIds').rename(columns={'trackedSearchIds': 'trackedSearchId'})
- 关联两个DataFrame
通过trackedSearchId字段做左连接,保留DF1的所有行:
result_df = df1.merge(df2_expanded, on='trackedSearchId', how='left')
最终结果示例:
isActive trackedSearchId Primary Keyword Group(s) 0 True id1 Group A 1 False id2 Group B 2 True id3 Group A
Spark DataFrame 实现方案
如果处理大数据量,用Spark的实现逻辑类似,利用explode函数拆分数组后再关联:
- 初始化Spark并构造数据
from pyspark.sql import SparkSession from pyspark.sql.functions import explode spark = SparkSession.builder.appName("ArrayMatchJoin").getOrCreate() df1 = spark.createDataFrame([ (True, 'id1'), (False, 'id2'), (True, 'id3') ], ['isActive', 'trackedSearchId']) df2 = spark.createDataFrame([ (['id1', 'id3'], 'Group A'), (['id2'], 'Group B') ], ['trackedSearchIds', 'Primary Keyword Group(s)'])
- 拆分数组列并关联
# 拆分数组列 df2_expanded = df2.withColumn('trackedSearchId', explode('trackedSearchIds')).drop('trackedSearchIds') # 左连接获取结果 result_df = df1.join(df2_expanded, on='trackedSearchId', how='left') # 展示结果 result_df.show()
输出结果:
+--------+---------------+-------------------------+ |isActive|trackedSearchId|Primary Keyword Group(s)| +--------+---------------+-------------------------+ | true| id1| Group A| | false| id2| Group B| | true| id3| Group A| +--------+---------------+-------------------------+
内容的提问来源于stack exchange,提问作者Avenger
相关产品推荐
相关产品推荐

