Dask categoryorize () не будет работать после использования .loc - PullRequest
0 голосов
/ 27 декабря 2018

У меня серьезная проблема с использованием dask (версия dask: 1.00, версия pandas: 0.23.3).Я пытаюсь загрузить кадр данных dask из файла CSV, отфильтровать результаты в два отдельных кадра данных и выполнить операции на обоих.

Однако после разделения кадров данных и попытки установить столбцы категории как «известные», они остаются «неизвестными».Таким образом, я не могу продолжать свои операции (которые требуют, чтобы столбцы категорий были «известны»).

ПРИМЕЧАНИЕ: Я создал минимальный пример, как предлагалось, с использованием pandas вместо read_csv ().

import pandas as pd
import dask.dataframe as dd

# Specify dtypes
b_dtypes = {
    'symbol': 'category',
    'price': 'float64',
}

i_dtypes = {
    'symbol': 'category',
    'price': 'object'
}

# Specify a function to quickly set dtypes
def to_dtypes(df, dtypes):
    for column, dtype in dtypes.items():
        if column in df.columns:
            df[column] = df.loc[:, column].astype(dtype)
    return df

# Set up our test data
data = [
    ['B', 'IBN', '9.9800'],
    ['B', 'PAY', '21.5000'],
    ['I', 'PAY', 'seventeen'],
    ['I', 'SPY', 'ten']
]

# Create pandas dataframe
pdf = pd.DataFrame(data, columns=['type', 'symbol', 'price'], dtype='object')

# Convert into dask
df = dd.from_pandas(pdf, npartitions=3)

#
## At this point 'df' simulates what I get when I read the mixed-type CSV file via dask
#

# Split the dataframe by the 'type' column
b_df = df.loc[df['type'] == 'B', :]
i_df = df.loc[df['type'] == 'I', :]

# Convert columns into our intended dtypes
b_df = to_dtypes(b_df, b_dtypes)
i_df = to_dtypes(i_df, i_dtypes)

# Let's convert our 'symbol' column to known categories
b_df = b_df.categorize(columns=['symbol'])
i_df['symbol'] = i_df['symbol'].cat.as_known()

# Is our symbol column known now?
print(b_df['symbol'].cat.known, flush=True)
print(i_df['symbol'].cat.known, flush=True)

#
## print() returns 'False' for both, this makes me want to kill myself.
## (Please help...)
#

ОБНОВЛЕНИЕ: Таким образом, кажется, что если я смещу параметры 'npartitions' в 1, то print () возвращает True в обоих случаях.Так что это похоже на проблему с разделами, содержащими разные категории.Однако загрузка обоих фреймов данных только в два раздела неосуществима, поэтому есть ли способ, которым я могу сказать dask, чтобы выполнить какую-либо сортировку для согласования категорий между разделами?

1 Ответ

0 голосов
/ 02 января 2019

Ответ на Ваш вопрос в основном содержится в doc .Я имею в виду код детали, закомментированный как # categorize requires computation, and results in known categoricals Я расширю здесь, потому что мне кажется, что вы неправильно используете loc

import pandas as pd
import dask.dataframe as dd

# Set up our test data
data = [['B', 'IBN', '9.9800'],
        ['B', 'PAY', '21.5000'],
        ['I', 'PAY', 'seventeen'],
        ['I', 'SPY', 'ten']
       ]

# Create pandas dataframe
pdf = pd.DataFrame(data, columns=['type', 'symbol', 'price'], dtype='object')

# Convert into dask
ddf = dd.from_pandas(pdf, npartitions=3)

# Split the dataframe by the 'type' column
# reset_index is not necessary
b_df = ddf[ddf["type"] == "B"].reset_index(drop=True)
i_df = ddf[ddf["type"] == "I"].reset_index(drop=True)

# Convert columns into our intended dtypes
b_df = b_df.categorize(columns=['symbol'])
b_df["price"] = b_df["price"].astype('float64')
i_df = i_df.categorize(columns=['symbol'])

# Is our symbol column known now? YES
print(b_df['symbol'].cat.known, flush=True)
print(i_df['symbol'].cat.known, flush=True)
...