带有列表返回的Pandas-Dask DataFrame Apply函数

时间:2018-10-10 20:35:14

标签: python pandas dataframe dask

我试图将多个列添加到dask数据框中以存储apply函数的结果。这将是我关于堆栈溢出的第一个问题,我希望这不会太长!

当前,我有这段工作代码:

create or replace procedure fire
is
  v_full_name VARCHAR2(500);
  sal varchar(200);
  jobid varchar(100);
  cpct varchar(50);
  mgid varchar(25);
  did varchar(20);
  cid varchar(20);
  rid varchar(20);
  lid varchar(20);

  Begin

  execute immediate 'create table resquery as
  (
 select HR.EMPLOYEES.FIRST_NAME||'' ''||HR.EMPLOYEES.LAST_NAME AS 
 Full_Name,HR.EMPLOYEES.SALARY as sal,HR.EMPLOYEES.JOB_ID as ji,
 HR.EMPLOYEES.COMMISSION_PCT as cmpct,HR.EMPLOYEES.MANAGER_ID as 
 mgid,HR.EMPLOYEES.DEPARTMENT_ID as dep,HR.COUNTRIES_EXTERNAL.COUNTRY_ID as 
 country,HR.DW_REGION.R_ID as region,
 HR.LOCATIONS.LOCATION_ID as loc
 into v_full_name,sal,jobid,cpct,mgid,did,cid,rid,lid
 from HR.EMPLOYEES
 join HR.DEPARTMENTS ON 
 HR.EMPLOYEES.DEPARTMENT_ID=HR.DEPARTMENTS.DEPARTMENT_ID
 join HR.LOCATIONS    ON HR.DEPARTMENTS.LOCATION_ID=HR.LOCATIONS.LOCATION_ID
 join HR.COUNTRIES_EXTERNAL ON     HR.LOCATIONS.COUNTRY_ID=HR.COUNTRIES_EXTERNAL.COUNTRY_ID
 join HR.DW_REGION    ON HR.COUNTRIES_EXTERNAL.REGION_ID=HR.DW_REGION.R_ID
 where HR.COUNTRIES_EXTERNAL.COUNTRY_ID=''US''
 AND trunc(HR.EMPLOYEES.HIRE_DATE) BETWEEN     TO_DATE(''16/08/2002'',''DD/MM/YYYY'') AND 
 TO_DATE(''07/12/2007'',''DD/MM/YYYY''))';

  end;
  /

本质上,我从熊猫数据框“天气”创建为黄昏数据框,然后将函数“ dfFunc”应用于数据框的每一行。

这段代码可以正常工作,因为输出“ res”是原始天气数据帧,带有新列“ NewCol1”。

我的困惑在于,如果我希望函数返回一个列表而不是一个值,那么该如何在dask数据框中创建多个列。

通过查看以前的线程,可以假设使用列表将列添加到Pandas Dataframe。因此更改行

from dask import dataframe as dd
from multiprocessing import cpu_count
nCores = cpu_count()

import dask.multiprocessing
dask.config.set(scheduler='processes')

def dfFunc(varA, varB):
    # Some calculations...
    return NewValue

ddf = dd.from_pandas(weather,npartitions=nCores)
ddf['NewCol1'] = ddf.map_partitions(lambda df: df.apply(lambda x: dfFunc(x['VarA'],x['VarB']), axis=1))
res = ddf.compute()

到以下内容:

return NewValue
ddf['newCol1'] = 

但是,它似乎无法与dask数据框一起使用,或者我只是不知道如何正确地编写代码,因为我只得到一列带有值列表的列。

return [NewValue1,NewValue2]
ddf = 

作为奖励,我也想在此过程中为这些列分配名称,但是ddf.compute()返回一个pandas数据帧,在此之后添加列名称应该不太困难。

1 个答案:

答案 0 :(得分:0)

似乎在堆栈溢出时我已经错过了一个类似的问题。至少有一个问题可以解决这个问题。

Dask Dataframe split column of list into multiple columns