如何在 PySpark 中按条件加入两个数据框?
How to join the two dataframe by condition in 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 没有任何主属性。
如何加入数据框
需要根据附加“_price”的数据框 2 List_Code 的值在数据框 1 中创建新列。如果数据框 2 List_Code 包含 20 个唯一值,我们需要在数据框 1 中创建 20 列。然后,我们根据 P_ID 如果存在,则用零填充。创建数据框后,我们需要根据 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
你能帮我解决这个问题吗,先谢谢了。
对于您的应用程序,您需要旋转第二个数据帧,然后使用左连接将第一个数据帧连接到 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|
+----+------+------+-----+-----+-----+
您可以根据需要更改列名或数据框的顺序。
我有两个如下所述的数据框
数据帧 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 没有任何主属性。
如何加入数据框 需要根据附加“_price”的数据框 2 List_Code 的值在数据框 1 中创建新列。如果数据框 2 List_Code 包含 20 个唯一值,我们需要在数据框 1 中创建 20 列。然后,我们根据 P_ID 如果存在,则用零填充。创建数据框后,我们需要根据 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
你能帮我解决这个问题吗,先谢谢了。
对于您的应用程序,您需要旋转第二个数据帧,然后使用左连接将第一个数据帧连接到 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|
+----+------+------+-----+-----+-----+
您可以根据需要更改列名或数据框的顺序。