PySpark:如何对特定列的数据框中的缺失值进行填充?

76

我有以下样本数据框:

a    | b    | c   | 

1    | 2    | 4   |
0    | null | null| 
null | 3    | 4   |

我想仅替换前两列 - 列“a”和“b”的空值:

a    | b    | c   | 

1    | 2    | 4   |
0    | 0    | null| 
0    | 3    | 4   |

这里是创建示例数据框的代码:

rdd = sc.parallelize([(1,2,4), (0,None,None), (None,3,4)])
df2 = sqlContext.createDataFrame(rdd, ["a", "b", "c"])

我知道如何使用以下方法替换所有的空值:

df2 = df2.fillna(0)

当我尝试这样做时,我失去了第三列:

df2 = df2.select(df2.columns[0:1]).fillna(0)

你可以在这里找到更多选项:https://dev59.com/QFgQ5IYBdhLWcg3wtmWq#65811297 - Danny Varod
2个回答

144
df.fillna(0, subset=['a', 'b'])

除非您使用的 Spark 版本低于 1.3.1,否则有一个名为 subset 的参数可用于选择列。


这会不会生成一个只有一列的新数据框?有没有办法原地进行操作? - Fizi
2
@Fizi 在 Spark 中,Dataframe 是不可变的,这意味着无法就地进行更改。 - johnnyasd12

74

使用字典填充某些列的值:

df.fillna( { 'a':0, 'b':0 } )

1
这是一个更好的答案,因为填充一个或多个值并不重要。 - Chris Marotta
@ChrisMarotta 所选列的值类型必须全部相同吗?是否也可以这样做:df.fillna( { 'a':0, 'b':'2022-12-01' } ),其中列a是数字类型,列b是日期类型? - nam
1
@nam,我建议你打开一个pyspark终端并找出答案。 - Chris Marotta
@nam要求的行为是可能的。在https://spark.apache.org/docs/3.1.3/api/python/reference/api/pyspark.sql.DataFrameNaFunctions.fill.html中可以看到第三个示例。 - Naveen Reddy Marthala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接