python - 通过列表字典迭代过滤火花数据帧
问题描述
我有一个看起来像这样a_dict={"E1":["a",10,20,"red"],"E2":["b", 7, 14,"green"],"E3":["c",40,50,"blue"]]
但更长的字典,我想同时用每个列表元组过滤一个火花数据框。让我们看一个数据框的例子:
+----------------------+
| User| value| color |
+----------------------+
| a| 12| red|
| a| 21| red|
| b| 8| green|
| b| 13| green|
| c| 41| blue|
| b| 72| red|
| c| 52| blue|
| a| 13| yellow|
+----------------------+
我现在正在做的是:
for key, value in a_dict.items():
df=df.filter((df.user == value[0])
& (df.value > value[1])
& (df.value< value[2])
& (df.color==value[3]))
虚拟 df 输出应该是这样的:
+----------------------+
| User| value| color |
+----------------------+
| a| 12| red|
| b| 8| green|
| b| 13| green|
| c| 41| blue|
+----------------------+
我想知道是否有一种更快的方法,而不使用 for 循环并每次都重新分配数据帧。
解决方案
您可以从字典值创建一个数据框,并进行半连接以过滤原始数据框:
a_dict = {"E1":["a",10,20,"red"],"E2":["b", 7, 14,"green"],"E3":["c",40,50,"blue"]}
df2 = spark.createDataFrame(a_dict.values(), ['user', 'value1', 'value2', 'color'])
result = df.join(df2,
(df['user'] == df2['user']) &
(df['color'] == df2['color']) &
(df['value'].between(df2['value1'], df2['value2'])),
'left_semi'
)
result.show()
+----+-----+-----+
|User|value|color|
+----+-----+-----+
| c| 41| blue|
| b| 8|green|
| b| 13|green|
| a| 12| red|
+----+-----+-----+
推荐阅读
- html - gatsby - htmlComponentRenderer.default 不是函数
- python-3.x - urllib.error.HTTPError:HTTP 错误 429:Python googlesearch 包的 search() 中的请求过多
- mysql - COUNT 来自 except 子查询的行数
- sql-server - 在同一列上使用多个 WHERE 条件进行选择时 AND 的简写
- javascript - VideoJs 不适用于 IOS [无法加载媒体]
- websocket - 我可以在 Windows 服务器上运行 redis 吗?
- python - 即使在逐点向每个元素加一之后,numpy 数组中的最小元素仍然为零
- r - RcppEigen 列标签
- php - 如何在 yii2 网格视图的 tbody 和 td 中添加类?
- node.js - MongoError:无法从 BSON 类型字符串转换为日期