计算组内值的比例

jm81lzqq  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(351)

我试图计算特定值在子组中特定列中出现的比例。
示例Dataframe

pdf = pd.DataFrame({
    'id': [1, 1, 1, 1, 2, 2, 2, 3, 3, 3],
    'letter': ['L', 'A', 'L', 'L', 'L', 'L', 'L', 'A', 'L', 'L']
})
df = spark.createDataFrame(pdf)
df.show()

我试着依赖这个答案,但代码如下

df\
    .groupby('id')\
    .agg((count(col('letter') == 'L') / count(col('letter'))).alias('prop'))\
    .show()

我得到了一列 1.0 ,即使我改变了 'L''A' .
我所期望的产出是,对于每一组来说 'L' 组内值:

+---+--------+
| id|    prop|
+---+--------+
|  1|    0.75|
|  2|     1.0|
|  3| 0.66667|
+---+--------+
iibxawm4

iibxawm41#

在计算之前,需要使用 when :

df\
    .groupby('id')\
    .agg((count(when(col('letter') == 'L', 1)) / count(col('letter'))).alias('prop'))\
    .show()

请注意 count 只统计非空条目。它不仅重要 true 条目,正如您在代码中所期望的那样。如果您使用 count_if 来自spark sql。

u2nhd7ah

u2nhd7ah2#

你可以用 sumwhen 而是计算 L :

df.groupby('id')\
  .agg((F.sum(F.when(F.col('letter') == 'L', 1)) / F.count(F.col('letter'))).alias('prop'))\
  .show()

这将仅在非空值中提供比例。如果要计算所有行,请除以 count("*") 而不是 count(col('letter')) .

相关问题