使用Pyspark和ntil函数,我正在寻找一种在排名时处理空值的方法.下面的代码也会将空值排序为1.我不想这样,我希望他们的排名为空.并且仅对非空值进行排序.

我可以在排名之前过滤掉空值,但随后由于我的用例,我需要将空值加入回go .

有没有一种方法只对值进行排名,从排名中go 掉NULL,而仍然保留所有行?

import numpy as np
from pyspark.sql import SparkSession

#spark = SparkSession.builder.appName("PandasToSpark").getOrCreate()

data = pd.DataFrame({'ID':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16, 18, 18, 19, 20],
                    'group':['A']*10 + ['B']*10,
'feature':[0.5, 3.4, 0.3, 0.1, 1.2, np.nan, 2, np.nan, 1.1, 2.2, np.nan, 1.32, 2.5, np.nan, 0.87, 1.56, 2.1, np.nan, 0.34, 7.43]})

spark_df = spark.createDataFrame(data)

window = Window.partitionBy(['group']).orderBy('feature')

spark_df =  spark_df.withColumn("feature_rank", F.ntile(5).over(window))

spark_df.display()

推荐答案

试试下面的方法--

from pyspark.sql.functions import *
from pyspark.sql.window import Window

window = Window.partitionBy(['group']).orderBy(col('feature').asc_nulls_last())

df1 = spark_df.withColumn("feature_rank", when(col("feature").isNull(), None).otherwise(lit(0)))
df2 = df1.withColumn("feature_rank", when(col("feature").isNull(), col("feature_rank")).otherwise(ntile(5).over(window)))

df2.show()

+---+-----+-------+------------+
| ID|group|feature|feature_rank|
+---+-----+-------+------------+
|  4|    A|    0.1|           1|
|  3|    A|    0.3|           1|
|  1|    A|    0.5|           2|
|  9|    A|    1.1|           2|
|  5|    A|    1.2|           3|
|  7|    A|    2.0|           3|
| 10|    A|    2.2|           4|
|  2|    A|    3.4|           4|
|  6|    A|   null|        null|
|  8|    A|   null|        null|
| 19|    B|   0.34|           1|
| 15|    B|   0.87|           1|
| 12|    B|   1.32|           2|
| 16|    B|   1.56|           2|
| 18|    B|    2.1|           3|
| 13|    B|    2.5|           3|
| 20|    B|   7.43|           4|
| 11|    B|   null|        null|
| 14|    B|   null|        null|
| 18|    B|   null|        null|
+---+-----+-------+------------+

这里是asc_nulls_last()-

根据列的升序返回排序表达式,空值出现在非空值之后.

Python相关问答推荐

PyTorch卷积自动编码器,输出维度与输入不同

按 struct 值对Polars列表[struct[]]排序

telegram 机器人API setMyName不起作用

替换字符串中的点/逗号,以便可以将其转换为浮动

Python主进程和分支进程如何共享gc信息?

遵循轮廓中对象方向的计算线

Python -根据另一个数据框中的列编辑和替换数据框中的列值

pandas DataFrame GroupBy.diff函数的意外输出

替换字符串中的多个重叠子字符串

如何将双框框列中的成对变成两个新列

从收件箱中的列中删除html格式

Telethon加入私有频道

两个pandas的平均值按元素的结果串接元素.为什么?

使用setuptools pyproject.toml和自定义目录树构建PyPi包

迭代嵌套字典的值

提取相关行的最快方法—pandas

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

Polars asof在下一个可用日期加入

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

基于Scipy插值法的三次样条系数