如何基于查找数据框创建数据框并在特定列中的动态和映射值上创建多列

Posted

技术标签:

【中文标题】如何基于查找数据框创建数据框并在特定列中的动态和映射值上创建多列【英文标题】:How to create a dataframe based on the lookup dataframe and create mulitple column on dynamic and map values in the specific columns 【发布时间】:2021-06-16 17:20:49 【问题描述】:

我有两个数据框,一个是主要的,另一个是查找数据框。我需要使用 pyspark 以自定义形式实现第三个。我需要检查 list_ids 列中的值并检查查找数据框中的匹配并在最终数据框中标记计数。我尝试过数组相交和数组查找,但它不起作用。

主要数据框:

df = spark.createDataFrame([(123, [75319, 75317]), (212, [136438, 25274]), (215, [136438, 75317])], ("ID", "list_IDs"))
df.show()

+---+---------------+
| ID|       list_IDs|
+---+---------------+
|123| [75319, 75317]|
|212|[136438, 25274]|
|215|[136438, 75317]|
+---+---------------+

查找数据框:

df_2 = spark.createDataFrame([(75319, "Wheat", 20), (75317, "Rice", 10), (136438, "Jowar", 30), (25274, "Rajma", 40)], ("ID", "Material", "Count"))
df_2.show()

+------+--------+-----+
|    ID|Material|Count|
+------+--------+-----+
| 75319|   Wheat|   A|
| 75317|    Rice|   B|
|136438|   Jowar|   C|
| 25274|   Rajma|   D|
+------+--------+-----+

需要结果数据框

+---+---------------+------+------+-------+------+
| ID|       list_IDs|Wheat | Rice | Jowar | Rajma|
+---+---------------+------+------+-------+------+
|123| [75319, 75317]|    A|    B|    0 |     0|
|212|[136438, 25274]|    0|    0|    C |     D|
|215|[136438, 75317]|    0|    B|    C |    0 |
+---+---------------+------+------+-------+------+

【问题讨论】:

【参考方案1】:

您可以连接两个数据框,然后进行旋转:

import pyspark.sql.functions as F

df2 = df.join(
    df_2, 
    F.array_contains(df.list_IDs, df_2.ID)
).groupBy(df.ID, 'list_IDs').pivot('Material').agg(F.first('Count')).fillna(0)

result.show()
+---+---------------+-----+-----+----+-----+
| ID|       list_IDs|Jowar|Rajma|Rice|Wheat|
+---+---------------+-----+-----+----+-----+
|212|[136438, 25274]|   30|   40|   0|    0|
|215|[136438, 75317]|   30|    0|  10|    0|
|123| [75319, 75317]|    0|    0|  10|   20|
+---+---------------+-----+-----+----+-----+

【讨论】:

以上是关于如何基于查找数据框创建数据框并在特定列中的动态和映射值上创建多列的主要内容,如果未能解决你的问题,请参考以下文章

如何更新python中熊猫数据框特定列中的所有行?

如何在数据框名称而不是列中查找字符串?

基于动态选择启用文本框并对文本框应用验证

R数据框复制不同空列中的值

Python - 使用 +/- 振荡值迭代数据框并根据条件创建新列

在熊猫数据框列中查找特定文本