pandas - Pyspark - 如何回填 DataFrame?

你怎么能和做同样的事情 df.fillna(method='bfill') 对于带有 的 Pandas 数据框pyspark.sql.DataFrame ?

pyspark 数据框具有 pyspark.sql.DataFrame.fillna 方法,但是不支持 method范围。

在 Pandas 中,您可以使用以下内容回填时间序列:

创建数据

import pandas as pd

index = pd.date_range('2017-01-01', '2017-01-05')
data = [1, 2, 3, None, 5]

df = pd.DataFrame({'data': data}, index=index)

捐赠
Out[1]:
            data
2017-01-01  1.0
2017-01-02  2.0
2017-01-03  3.0
2017-01-04  NaN
2017-01-05  5.0

回填数据框
df = df.fillna(method='bfill')

生产回填框架
Out[2]:
            data
2017-01-01  1.0
2017-01-02  2.0
2017-01-03  3.0
2017-01-04  5.0
2017-01-05  5.0

对于 pyspark.sql.DataFrame 怎么能做同样的事情呢? ?

最佳答案

实际上,对分布式数据集进行回填并不像在 Pandas(本地)数据帧中那样容易——您无法确定要填充的值存在于同一分区中。我会使用带有窗口的 crossJoin,例如 DF:

df = spark.createDataFrame([
    ('2017-01-01', None), 
    ('2017-01-02', 'B'), 
    ('2017-01-03', None), 
    ('2017-01-04', None), 
    ('2017-01-05', 'E'), 
    ('2017-01-06', None), 
    ('2017-01-07', 'G')], ['date', 'value'])
df.show()

+----------+-----+
|      date|value|
+----------+-----+
|2017-01-01| null|
|2017-01-02|    B|
|2017-01-03| null|
|2017-01-04| null|
|2017-01-05|    E|
|2017-01-06| null|
|2017-01-07|    G|
+----------+-----+

代码将是:
from pyspark.sql.window import Window

df.alias('a').crossJoin(df.alias('b')) \
    .where((col('b.date') >= col('a.date')) & (col('a.value').isNotNull() | col('b.value').isNotNull())) \
    .withColumn('rn', row_number().over(Window.partitionBy('a.date').orderBy('b.date'))) \
    .where(col('rn') == 1) \
    .select('a.date', coalesce('a.value', 'b.value').alias('value')) \
    .orderBy('a.date') \
    .show()

+----------+-----+
|      date|value|
+----------+-----+
|2017-01-01|    B|
|2017-01-02|    B|
|2017-01-03|    E|
|2017-01-04|    E|
|2017-01-05|    E|
|2017-01-06|    G|
|2017-01-07|    G|
+----------+-----+

https://stackoverflow.com/questions/43773520/

相关文章:

haxe - 是否有 atexit() 等同于 Haxe?

javascript - 在哪里发布代码以供开源使用?

symfony - 如何为使用 stwe/DatatablesBundle 生成的表中的行着色?

c - 为什么需要为越来越多的指针数组重新分配内存?

sql - 有条件的平均值

azure-pipelines-release-pipeline - 将 KeyVault 访问集成

ibm-midrange - 在 AS400 中的程序之间传递可选参数

php - 在 Symfony 3.1.1 表单的输入文本字段中添加掩码

r - big.matrix 文档中不可重现的示例(应用)

groovy - php 类似于 Groovy 中的关联数组