Выяснить и назначить типы столбцов в Dask Dataframe - PullRequest
0 голосов
/ 09 ноября 2019

В настоящее время я использую Pandas dataframe. Я перебираю строки и основываюсь на количестве типов данных, которые я назначаю этому dtype для этого столбца. Скажем, у меня есть датафрейм, как показано ниже:

    column1   column2   column3
0   1.43816      lots    1.9837
1  -0.28378        of   0.01758
2  0.552564    string  0.257276
3     dummy    inthis  -1.34906
4    string    column   1.33308
5  0.944862 -0.657849    dadada

, и мой код выглядит следующим образом: (Рабочий пример без Dask)

import numpy as np
import pandas as pd

def is_number(column, column_length):
    count = 0
    for row in column:
        if isinstance(row, np.int) == True and \
                str(row) != 'True' and str(row) != 'False':
            count += 1
        elif isinstance(row, np.float) == True:
            count += 1
    if count >= column_length*0.51:
        column = pd.to_numeric(column, errors='coerce')
    return column

data = {'column1': [1.438161, -0.283780, 0.552564, 'dummy', 'string', 0.944862],
        'column2': ['lots', 'of', 'string', 'inthis', 'column', -0.657849],
        'column3': [1.983704, 0.017580, 0.257276, -1.349062, 1.333079, 'dadada']}
df = pd.DataFrame(data)
print(df)
print(df.dtypes)
column_names = df.columns
for column in column_names:
    column_length = len(df[column])
    df[column] = is_number(df[column], column_length)
print(df.dtypes)

Поскольку мои фактические данные огромны, я хотел использовать Daskчтобы добавить некоторую масштабируемость и снизить использование памяти, отбрасывая после определения dtypes столбцов и также не загружая весь набор данных в память. (и также ускоряя процесс). Но когда я хотел перебрать строки dask dataframe, он выдает ошибку: NotImplementedError: Series getitem in only supported for other series objects with matching partition structure в строке for row in column. Разделение строк не поддерживается в рамках Dask. Как я могу добиться того же с помощью Dask dataframes? Я также думаю о разбиении dataframe на столбцы и выполняю эту операцию параллельно. Как я могу распараллелить эту операцию (цикл for) в Dask (dask.distributed, поскольку я думаю об использовании кластера машин)?

И мой «не работающий» код Dask:

import numpy as np
import pandas as pd
import dask.dataframe as dd

def is_number(column, column_length):
    count = 0
    for row in column:
        if isinstance(row, np.int) == True and \
                str(row) != 'True' and str(row) != 'False':
            count += 1
        elif isinstance(row, np.float) == True:
            count += 1
    if count >= column_length*0.51:
        column = pd.to_numeric(column, errors='coerce')
    return column

data = {'column1': [1.438161, -0.283780, 0.552564, 'dummy', 'string', 0.944862],
        'column2': ['lots', 'of', 'string', 'inthis', 'column', -0.657849],
        'column3': [1.983704, 0.017580, 0.257276, -1.349062, 1.333079, 'dadada']}
df = pd.DataFrame(data)
df = dd.from_pandas(df, npartitions=8)
df = df.repartition(partition_size="100MB")
print(df)
print(df.dtypes)
column_names = df.columns
for column in column_names:
    column_length = len(df[column])
    df[column] = is_number(df[column], column_length)
print(df.dtypes)

и полный возврат:

Traceback (most recent call last):
  File "/home/dodzilla-ai/.PyCharm2019.2/config/scratches/scratch_1.py", line 28, in <module>
    df[column] = is_number(df[column], column_length)
  File "/home/dodzilla-ai/.PyCharm2019.2/config/scratches/scratch_1.py", line 7, in is_number
    for row in column:
  File "/home/dodzilla-ai/Projects/project/venv/lib/python3.6/site-packages/dask/dataframe/core.py", line 2673, in __getitem__
    "Series getitem in only supported for other series objects "
NotImplementedError: Series getitem in only supported for other series objects with matching partition structure

...