从值不同的两个数据框中获取列

Posted

技术标签:

【中文标题】从值不同的两个数据框中获取列【英文标题】:Get columns from two dataframes where values differ 【发布时间】:2020-03-23 05:04:27 【问题描述】:

我有两个几乎相同的 Pyspark 数据框:相同的行数和 row_id,相同的架构,但每行的某些列的值不同。

我想确定每一行的那些列。

例子:

数据框 A

id  fname   lname   email
1   Michael Jackson mj@yahoo.com
2   Roger   Moore   rm@rocketmail.com
3   Angela  Merkel  am@dw.de

数据框 B

id  fname   lname   email
1   Michael Jordan  mj@yahoo.com
2   Gordon  Moore   rm@rocketmail.com
3   Angela  Markle  am@dw.com

预期的输出是字典列表:

[ 
  "1": ["lname"], 
  "2": ["fname"] , 
  "3": ["lname", "email"] 
]

【问题讨论】:

【参考方案1】:

这是一个更通用的答案,使用 RDD 转换:

column_names = a_df.schema.names

def compare(row):
    diff_columns = []
    for col in column_names:
        if row[1][0][col] != row[1][1][col]:
            diff_columns.append(col)

    return ( row[0],   row[0]: diff_columns  )

# convert to Pair RDD for joining
a_pair_rdd = a_df.rdd.map(lambda x: (x['id'], x))
b_pair_rdd = b_df.rdd.map(lambda y: (y['id'], y))
joined_rdd = a_pair_rdd.join(b_pair_rdd)

output = joined_rdd.map(compare).map(lambda pair: pair[1]).collect()

【讨论】:

以上是关于从值不同的两个数据框中获取列的主要内容,如果未能解决你的问题,请参考以下文章

如何获取和比较pyspark中两个数据框中相似列的所有值的数据类型

Struts2-从值栈中获取数据-EL表达式从值栈获取

pyspark:比较给定列的值时从数据框中获取公共数据

从值栈获取数据

从值栈中获取数据

使用 pandas 连接两个数据框中的不同列(并附加相似的列)