>

Dask Series에 적용된 함수에서 여러 값을 어떻게 반환합니까? dask.Series.apply 의 각 반복에서 시리즈를 반환하려고합니다.  그리고 최종 결과는 dask.DataFrame 입니다 .

다음 코드는 메타가 잘못되었음을 나타냅니다. 그러나 모든 팬더 버전이 작동합니다. 여기서 무엇이 잘못 되었나요?

업데이트 :메타/스키마를 올바르게 지정하지 않은 것 같습니다. 올바르게 어떻게해야합니까? 이제 메타 인수를 삭제하면 작동합니다. 그러나 경고가 발생합니다. "정확하게"dask를 사용하고 싶습니다.

import dask.dataframe as dd
import pandas as pd
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
def transformMyCol(x):
    #Minimal Example Function
    return(pd.Series(['Tom - ' + str(x),'Deskflip - ' + str(x / 8),'']))
#
## Pandas Version - Works as expected.
#
pandas_df = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
pandas_df.target.apply(transformMyCol,1)
#
## Dask Version (second attempt) - Raises a warning
#
df = dd.from_pandas(pandas_df, npartitions=10)
unpacked = df.target.apply(transformMyCol)
unpacked.head()
#
## Dask Version (first attempt) - Raises an exception 
#
df = dd.from_pandas(pandas_df, npartitions=10)
unpacked_dask_schema = {"name" : str, "action" : str, "comments" : str}
unpacked = df.target.apply(transformMyCol, meta=unpacked_dask_schema)
unpacked.head()

이것은 내가 얻는 오류입니다 :

 File "/anaconda3/lib/python3.7/site-packages/dask/dataframe/core.py", line 3693, in apply_and_enforce
    raise ValueError("The columns in the computed data do not match"
ValueError: The columns in the computed data do not match the columns in the provided metadata

또한 다음 사항을 확인했으며 작동하지 않습니다.

meta_df = pd.DataFrame(dtype='str',columns=list(unpacked_dask_schema.keys()))

unpacked = df.FILEDATA.apply(transformMyCol, meta=meta_df)
unpacked.head()

같은 오류 :

 File "/anaconda3/lib/python3.7/site-packages/dask/dataframe/core.py", line 3693, in apply_and_enforce
    raise ValueError("The columns in the computed data do not match"
ValueError: The columns in the computed data do not match the columns in the provided metadata


  • 답변 # 1

    맞습니다. 문제는 메타를 올바르게 지정하지 않았다는 것입니다. 더 구체적으로 오류 메시지에서 알 수 있듯이 메타 데이터 열 ( "name", "action", "comments" )가 계산 된 데이터의 열과 일치하지 않습니다 ( 0, 1, 2 ). 다음 중 하나를 수행해야합니다.

    <올>

    메타 데이터 열을 0, 1, 2 :로 변경

      unpacked_dask_schema = dict.fromkeys(range(3), str)
       df.target.apply(transformMyCol, meta=unpacked_dask_schema)
    
    

    또는

    와이즈 비즈 변경  명명 된 열을 사용하려면 :

    transformMyCol
    
    
    def transformMyCol(x): return pd.Series({ 'name': 'Tom - ' + str(x), 'action': 'Deskflip - ' + str(x / 8), 'comments': '', }))

관련 자료

  • 이전 html - 오버 플로우 랩이 텍스트에 적용되지 않음
  • 다음 C ++에서 벡터 쌍의 벡터를 사용하여 인접 목록을 만드는 방법은 무엇입니까?