使用groupby操作将Pandas代码编码到PySpark

时间:2019-06-26 14:48:13

标签: python pandas dataframe pyspark

在大熊猫中,我实现了以下转换:基本上是将第一个非空值拆分为随后的空值。

[100, None, None, 40, None, 120]

进入

[33.33, 33.33, 33.33, 20, 20, 120]

由于提供了here的解决方案,我设法为我的特定任务生成了以下代码:

cols = ['CUSTOMER', 'WEEK', 'PRODUCT_ID']
colsToSplit = ['VOLUME', 'REVENUE']
df = pd.concat([
    d.asfreq('W')
    for _, d in df.set_index('WEEK').groupby(['CUSTOMER', 'PRODUCT_ID'])
]).reset_index()
df[cols] = df[cols].ffill()
df['nb_nan'] = df.groupby(['CUSTOMER', 'PRODUCT_ID', df_sellin['VOLUME'].notnull().cumsum()])['VOLUME'].transform('size')
df[colsToSplit] = df.groupby(['CUSTOMER', 'PRODUCT_ID'])[colsToSplit].ffill()[colsToSplit].div(df.nb_nan, axis=0)
df

我的完整数据框如下所示:

 df = pd.DataFrame(map(list, zip(*[['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
           ['2018-01-14', '2018-01-28', '2018-01-14', '2018-01-28', '2018-01-14', '2018-02-04', '2018-02-11', '2018-01-28', '2018-02-11'],
           [1, 1, 2, 2, 1, 1, 1, 3, 3],
           [50, 44, 22, 34, 42, 41, 43, 12, 13],
           [15, 14, 6, 11, 14, 13.5, 13.75, 3, 3.5]])), columns =['CUSTOMER', 'WEEK', 'PRODUCT_ID', 'VOLUME', 'REVENUE']) 

 df
Out[16]: 
      CUSTOMER        WEEK  PRODUCT_ID  VOLUME  REVENUE
    0        a  2018-01-14           1      50    15.00
    1        a  2018-01-28           1      44    14.00
    2        a  2018-01-14           2      22     6.00
    3        a  2018-01-28           2      34    11.00
    4        b  2018-01-14           1      42    14.00
    5        b  2018-02-04           1      41    13.50
    6        b  2018-02-11           1      43    13.75
    7        c  2018-01-28           3      12     3.00
    8        c  2018-02-11           3      13     3.50

例如,在这种情况下,结果将是:

CUSTOMER        WEEK  PRODUCT_ID  VOLUME  REVENUE
a         2018-01-14           1      25     7.50
a         2018-01-21           1      25     7.50
a         2018-01-28           1      44    14.00
a         2018-01-14           2      11     3.00
a         2018-01-21           2      11     3.00
a         2018-01-28           2      34    11.00
b         2018-01-14           1      14     4.67
b         2018-01-21           1      14     4.67
b         2018-01-28           1      14     4.67
b         2018-02-04           1      41    13.50
b         2018-02-11           1      43    13.75
c         2018-01-28           3       6     1.50
c         2018-02-04           3       6     1.50
c         2018-02-11           3      13     3.50

可悲的是,我的数据框太大了,无法进一步使用,无法与其他数据集连接,因此我想用Spark进行测试。我检查了很多教程来计算PySpark中的大多数步骤,但是没有一个教程真正显示如何包括groupby部分。因此,我发现了如何执行transform('size')而不是df.groupby(...)。transform('size')以及如何合并所有步骤的方法。

也许有可以将熊猫翻译成PySpark的工具吗?否则,我是否可以了解如何翻译这段代码?谢谢,也许我只是把这个复杂化了。

0 个答案:

没有答案