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]| +---+----------+-----+----+--------+------------------+
我们可以看到,id 和 impression 列填充了指定的值 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]| +---+----------+-----+----+--------+------------------+