В настоящее время я использую 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