как включить параметр в маску или где функция в кадре данных Koalas - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть кадр данных Koalas, работающий в Azure кирпичах данных, скажем:

import databricks.koalas   as pd

df = pd.DataFrame({'category': ['A', 'A', 'B'],
                   'col1': [1, 2, 3],
                   'col2': [4, 5, 6]},
                  columns=['category', 'col1', 'col2'])

Я хочу создать новый столбец (в настоящее время в функции), который оценивает столбец в зависимости от его значений (который являются конечными и известными) и заполняет новый столбец элементами из столбцов другого набора данных. (Почему ?, потому что этот второй набор данных содержит параметры для включения и был предварительно отфильтрован перед использованием для извлечения этих данных)

Я пробовал (код из функции, которая вызывает df и params)

    return      df.assign(col3= df.category.map({
      'A': params['column1'] , 
      'B' : params['column2']  , 
      'C': params['column3']     
    #}) )

с сообщением об ошибке:

PandasNotImplementedError: The method `pd.Index.__iter__()` is not implemented. If you want to collect your data as an NumPy array, use 'to_numpy()' instead.

, что странно, поскольку у меня нет звонка на Pandas в любом месте

Также я попытался:

    df = df.assign(col3 = None)

    return     df.col3.mask(df.category== 'A', params['column1']) \
                .mask(df.category == 'B' , params['column2'])\
                .mask(df.category == 'C', params['column3'])

Во втором случае возвращенный фрейм данных имеет все значения nan.

Я также уже установил для 'compute.ops_on_diff_frames' значение True

1 Ответ

0 голосов
/ 18 февраля 2020

Я нашел обходной путь к этой проблеме, но я до сих пор не понимаю, почему.

В моем случае я делаю два шага. Первый - сбросить индекс отфильтрованного кадра данных параметра.

params = orig_params.loc[*whatever filtering may fit here*].reset_index()

Во-вторых, просто используйте отфильтрованный элемент, который мы хотим. Если этот шаг не используется, маскирование потребует от вас ввода серий столько, сколько потребуется. Здесь мы просто конвертируем его в скаляр, например:

    temp = df.category
    temp = temp.mask(temp == 'CBDC', params['column1'][0]) \
      .mask(temp == 'FDC' , params['column2'][0])\
      .mask(temp == 'OSHC', params['column3'][0])
    df1 = df.assign(col3 = temp)
    return df1

Надеюсь, это полезно. Если у кого-то есть лучшее решение и / или объяснение, пожалуйста, опубликуйте его.

...