我有一个pyspark数据框,我想在组内将另一行分开。在组内将有两行:一行的计数值为removal == 1
,另一行的计数值为removal == 0
。
我如何将一个计数除以另一个以在新列中获得每个组的比率? groupBy
在limit
和test_id
上
columns = ['removal', 'limit', 'test_id', 'count']
vals = [
(1, 'UL', 'AB', 141),
(0, 'UL', 'AB', 140),
(1, 'LL', 'AB', 21),
(0, 'LL', 'AB',12),
(0, 'UL', 'EF', 200),
(1, 'UL', 'EF',12)
]
我想要什么:(或布局类似)
columns = ['limit', 'test_id', 'ratio', count_1, count_0]
vals = [
('UL', 'AB', 1.007, 141, 140)
('LL', 'AB', 1.75, 21, 12),
('UL', 'EF', 0.06, 12, 200)
]
我知道通过拆分然后再次合并数据的方法,但我希望有一个更好的agg函数。
答案 0 :(得分:2)
由于每个where
的值只有一行,因此直接的方法是使用join
来过滤每个不同的值和from pyspark.sql.functions import col
df.where("removal = 1").alias("a")\
.join(df.where("removal = 0").alias("b"), on=["limit", "test_id"])\
.select(
"limit",
"test_id",
(col("a.count") / col("b.count")).alias("ratio"),
col("a.count").alias("count_1"),
col("b.count").alias("count_0")
).show()
#+-----+-------+------------------+-------+-------+
#|limit|test_id| ratio|count_1|count_0|
#+-----+-------+------------------+-------+-------+
#| UL| AB|1.0071428571428571| 141| 140|
#| LL| AB| 1.75| 21| 12|
#| UL| EF| 0.06| 12| 200|
#+-----+-------+------------------+-------+-------+
:
{{1}}