首页 > 解决方案 > 如何在 PySpark 中按条件连接两个数据框?

问题描述

我有两个数据框,如下所述

数据框 1

P_ID     P_Name     P_Description   P_Size

100      Moto          Mobile         16

200      Apple         Mobile         15

300      Oppo          Mobile         18

数据框 2

P_ID     List_Code      P_Amount     

100      ALPHA           20000         

100      BETA            60000  

300      GAMMA           15000    

要求: 需要通过 P_ID 加入两个数据帧。

有关数据框的信息: 在数据框 1 中,P_ID 是主键,而数据框 2 没有任何主要属性。

如何加入数据 框需要根据数据框 2 的值在数据框 1 中创建新列 List_Code 附加“_price”。如果数据框 2 List_Code 包含 20 个唯一值,我们需要在数据框 1 中创建 20 列。然后,我们根据 P_ID 从数据框 2 P_Amount 列(如果存在)填充数据框 1 中新创建的列中的值,否则填充为零。创建数据框后,我们需要根据 P_ID 加入数据框。如果我们在数据框 1 中添加具有预期值的列,我们可以加入数据框。我的问题是创建具有预期值的新列。

预期的数据框如下所示

预期的数据框

   P_ID     P_Name     P_Description   P_Size   ALPHA_price   BETA_price    GAMMA_price

    100      Moto          Mobile         16       20000       60000           0

    200      Apple         Mobile         15         0            0            0

    300      Oppo          Mobile         18         0            0           15000

你能帮我解决问题吗,在此先感谢。

标签: python-3.xdataframeapache-sparkpysparkpyspark-dataframes

解决方案


对于您的应用程序,您需要旋转第二个数据帧,然后使用左连接将第一个数据帧连接到 P_ID 上的旋转结果。

请参阅下面的代码。

df_1 = pd.DataFrame({'P_ID' : [100, 200, 300], 'P_Name': ['Moto', 'Apple', 'Oppo'], 'P_Size' : [16, 15, 18]})
sdf_1 = sc.createDataFrame(df_1)

df_2 = pd.DataFrame({'P_ID' : [100, 100, 300], 'List_Code': ['ALPHA', 'BETA', 'GAMMA'], 'P_Amount' : [20000, 60000, 10000]})
sdf_2 = sc.createDataFrame(df_2)

sdf_pivoted = sdf_2.groupby('P_ID').pivot('List_Code').agg(f.sum('P_Amount')).fillna(0)



sdf_joined = sdf_1.join(sdf_pivoted, on='P_ID', how='left').fillna(0)
sdf_joined.show()

+----+------+------+-----+-----+-----+
|P_ID|P_Name|P_Size|ALPHA| BETA|GAMMA|
+----+------+------+-----+-----+-----+
| 300|  Oppo|    18|    0|    0|10000|
| 200| Apple|    15|    0|    0|    0|
| 100|  Moto|    16|20000|60000|    0|
+----+------+------+-----+-----+-----+

您可以根据需要更改数据框的列名或顺序。


推荐阅读