python用均值填充空值_python-用同一列的平均值填充Pyspark数据框列的空值

本文介绍了如何在Pyspark数据框中使用同一列的平均值来填充空值。通过创建一个函数`fill_with_mean`,可以更高效地计算平均值并填充缺失值,避免了原始方法的繁琐步骤。示例展示了如何处理包含ID、类型、成本和日期的列,并排除特定列(如ID和日期)不受影响。
摘要由CSDN通过智能技术生成

有了这样的数据框

rdd_2 = sc.parallelize([(0,10,223,"201601"), (0,10,83,"2016032"),(1,20,None,"201602"),(1,20,3003,"201601"), (1,20,None,"201603"), (2,40, 2321,"201601"), (2,30, 10,"201602"),(2,61, None,"201601")])

df_data = sqlContext.createDataFrame(rdd_2, ["id", "type", "cost", "date"])

df_data.show()

+---+----+----+-------+

| id|type|cost| date|

+---+----+----+-------+

| 0| 10| 223| 201601|

| 0| 10| 83|2016032|

| 1| 20|null| 201602|

| 1| 20|3003| 201601|

| 1| 20|null| 201603|

| 2| 40|2321| 201601|

| 2| 30| 10| 201602|

| 2| 61|null| 201601|

+---+----+----+-------+

我需要用现有值的平均值填充空值,预期结果是

+---+----+----+-------+

| id|type|cost| date|

+---+----+----+-------+

| 0| 10| 223| 201601|

| 0| 10| 83|2016032|

| 1| 20|1128| 201602|

| 1| 20|3003| 201601|

| 1| 20|1128| 201603|

| 2| 40|2321| 201601|

| 2| 30| 10| 201602|

| 2| 61|1128| 201601|

+---+----+----+-------+

其中1128是现有值的平均值.我需要针对几列进行此操作.

我当前的方法是使用na.fill:

fill_values = {column: df_data.agg({column:"mean"}).flatMap(list).collect()[0] for column in df_data.columns if column not in ['date','id']}

df_data = df_data.na.fill(fill_values)

+---+----+----+-------+

| id|type|cost| date|

+---+----+----+-------+

| 0| 10| 223| 201601|

| 0| 10| 83|2016032|

| 1| 20|1128| 201602|

| 1| 20|3003| 201601|

| 1| 20|1128| 201603|

| 2| 40|2321| 201601|

| 2| 30| 10| 201602|

| 2| 61|1128| 201601|

+---+----+----+-------+

但这非常麻烦.有任何想法吗?

解决方法:

好吧,您必须采用一种或另一种方式:

>计算统计

>填补空白

它仍然在很大程度上限制了您在这里可以真正改善的地方:

>用first()[0]替换flatMap(list).collect()[0]或结构解压缩

>一次执行即可计算所有统计信息

>使用内置的Row方法提取字典

最终结果可能是这样的:

def fill_with_mean(df, exclude=set()):

stats = df.agg(*(

avg(c).alias(c) for c in df.columns if c not in exclude

))

return df.na.fill(stats.first().asDict())

fill_with_mean(df_data, ["id", "date"])

标签:pyspark-sql,python,apache-spark,pyspark,apache-spark-sql

来源: https://codeday.me/bug/20191010/1888000.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值