【发布时间】:2021-01-30 03:26:59
【问题描述】:
上下文
数据框应具有category 列,该列基于一组固定规则。规则集变得相当大。
问题
有没有办法使用元组列表(参见下面的示例)动态链接when 条件,以实现与底部硬编码解决方案相同的结果。
# Potential list of rule definitions
category_rules = [
('A', 8, 'small'),
('A', 30, 'large'),
('B', 5, 'small'),
# Group, size smaller value --> Category
# and so on ... e.g.,
]
示例
这是一个可重复性的玩具示例。由组和 id 组成的数据框应添加 category 列,这取决于 group 列的内容。规则列表显示在上面的部分中。
data = [('A', '45345', 5), ('C', '55345', 5), ('A', '35345', 10), ('B', '65345', 4)]
df = spark.createDataFrame(data, ['group', 'id', 'size'])
+-----+-----+-----+
|group| id| size|
+-----+-----+-----+
| A|45345| 5|
| C|55345| 5|
| A|35345| 10|
| B|65345| 4|
+-----+-----+-----+
硬编码解决方案
df = df.withColumn(
'category',
F.when(
(F.col('group') == 'A')
& (F.col('size') < 8),
F.lit('small')
).when(
(F.col('group') == 'A')
& (F.col('size') < 30),
F.lit('large')
).when(
(F.col('group') == 'B')
& (F.col('size') < 5),
F.lit('small')
).otherwise(
F.lit('unkown')
)
)
+-----+-----+----+--------+
|group| id|size|category|
+-----+-----+----+--------+
| A|45345| 5| small|
| C|55345| 5| unkown|
| A|35345| 10| large|
| B|65345| 4| small|
+-----+-----+----+--------+
[编辑 1] 添加更复杂的条件来解释为什么需要链接。
【问题讨论】:
标签: python dataframe apache-spark pyspark