python-3.x - 如何在 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
你能帮我解决问题吗,在此先感谢。
解决方案
对于您的应用程序,您需要旋转第二个数据帧,然后使用左连接将第一个数据帧连接到 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|
+----+------+------+-----+-----+-----+
您可以根据需要更改数据框的列名或顺序。
推荐阅读
- wordpress - 通过 add_action 传递变量
- python - 将字符添加到 csv 文件中的行
- java - 将字节数组转换为字符串 ascii 编码
- ruby-on-rails - 如何为调用 Ruby on Rails 中的可选多态关系提供虚拟值?
- dialogflow-es - Google 助理在 Dialogflow 中重复上一条消息时遇到问题
- javascript - 将文件夹上传到 GDrive 并获取用于上传文件的文件夹 ID
- java - 如何使用带有一个通用字符串的 Java 程序拆分文件?
- html - 如何使 Simplegrid CSS 网格居中
- javascript - Vuetify 多行标签
- weblogic12c - config.xml 是在创建域之后创建还是在 Weblogic 中首次启动管理服务器时创建?