Spark 教程

Spark SQL

Spark 笔记

Spark MLlib

spark dataframe fillna 函数用法详解

Spark DataFrame 原理及操作详解 Spark DataFrame 原理及操作详解


spark dataframe 的 fillna 函数等同于 na.fill()na.fill 函数底层也是调用 fillna,它的作用是填充列值 null 为指定的值,替换的列可以指定,每列的替换规则也可以通过 dict 字典参数设置,非常灵活。

函数语法

def fillna(self, value, subset=None)

fillna(self, value, subset=None) 函数还有一个别名函数 na.fill() 函数,该函数是版本 1.3.1 开始新增的。

  • 参数 value 支持 2 大形式:

    第一种形式是接收 int, long, float, string, bool 固定值设置,这种一般和后面的 subset 参数一起使用,将指定的字段统一改为指定值。

    第二种形式是 dict 字典类型,设置具体字段或列的值映射,这种形式会忽略后面的 subset 参数设置,因为后面的字段指定无意义。

  • subset 参数是可选项,指定要填充的字段或列列表,和 value 参数的第一种形式搭配使用。如果不设置,则表示作用于所有字段;如果设置的字段类型与设置值的类型不匹配,该字段值的替换则忽略,即不生效。

常用用法

为了便于演示首先手动创建 DataFrame 数据,示例如下:

from pyspark.sql import SparkSession

spark_session = SparkSession.builder \
    .appName('knowledgedict-dataframe') \
    .master('local') \
    .getOrCreate()

df = spark_session.createDataFrame(
    schema=['id', 'impression', 'click', 'ctr', 'city', 'content'],
    data=[
        (1, 100, 5, 0.05, 'beijing', ['product']),
        (None, 10, 3, 0.3, None, ['product', 'article']),
        (3, None, 5, 0.1, 'shanghai', ['article', 'person'])
    ]
)

df.show()

输出如下:

+----+----------+-----+----+--------+------------------+
|  id|impression|click| ctr|    city|           content|
+----+----------+-----+----+--------+------------------+
|   1|       100|    5|0.05| beijing|         [product]|
|null|        10|    3| 0.3|    null|[product, article]|
|   3|      null|    5| 0.1|shanghai| [article, person]|
+----+----------+-----+----+--------+------------------+

填充数字

针对如上的 dataframe 数据,填充为数字,承接上述代码,如下示例:

df = df.fillna(50)
df.show()

输出如下:

+---+----------+-----+----+--------+------------------+
| id|impression|click| ctr|    city|           content|
+---+----------+-----+----+--------+------------------+
|  1|       100|    5|0.05| beijing|         [product]|
| 50|        10|    3| 0.3|    null|[product, article]|
|  3|        50|    5| 0.1|shanghai| [article, person]|
+---+----------+-----+----+--------+------------------+

我们可以看到,idimpression 列填充了指定的值 50,city 字段的 null 值没有被填充,因为字段类型不匹配。

填充字符串

如果设置字符串,只有 city 字段生效,具体如下:

df = df.fillna('beijing')
df.show()

结果如下:

+----+----------+-----+----+--------+------------------+
|  id|impression|click| ctr|    city|           content|
+----+----------+-----+----+--------+------------------+
|   1|       100|    5|0.05| beijing|         [product]|
|null|        10|    3| 0.3| beijing|[product, article]|
|   3|      null|    5| 0.1|shanghai| [article, person]|
+----+----------+-----+----+--------+------------------+

填充 bool 值

如果填充 bool 值,示例中的 null 值列都不会被替换,因为类型都不匹配,代码如下:

df = df.fillna(False)
df.show()
+----+----------+-----+----+--------+------------------+
|  id|impression|click| ctr|    city|           content|
+----+----------+-----+----+--------+------------------+
|   1|       100|    5|0.05| beijing|         [product]|
|null|        10|    3| 0.3|    null|[product, article]|
|   3|      null|    5| 0.1|shanghai| [article, person]|
+----+----------+-----+----+--------+------------------+

指定列填充 null 值

利用 sunset 参数指定列填充 null 值,如下代码:

df = df.fillna(50, subset=['impression'])
df.show()

只针对 impression 列的 null 值进行填充:

+----+----------+-----+----+--------+------------------+
|  id|impression|click| ctr|    city|           content|
+----+----------+-----+----+--------+------------------+
|   1|       100|    5|0.05| beijing|         [product]|
|null|        10|    3| 0.3|    null|[product, article]|
|   3|        50|    5| 0.1|shanghai| [article, person]|
+----+----------+-----+----+--------+------------------+

通过字典列值一一映射填充

value 参数传递列和填充值的映射的 dict 类型,这种方式最灵活,可以针对不同的列进行不同的处理:

df = df.fillna({'id': 2, 'impression': 50, 'city': 'beijing'})
df.show()

所有 null 都被填充:

+---+----------+-----+----+--------+------------------+
| id|impression|click| ctr|    city|           content|
+---+----------+-----+----+--------+------------------+
|  1|       100|    5|0.05| beijing|         [product]|
|  2|        10|    3| 0.3| beijing|[product, article]|
|  3|        50|    5| 0.1|shanghai| [article, person]|
+---+----------+-----+----+--------+------------------+