Как применить функцию, которая создает несколько новых столбцов к фрейму данных Pandas, используя векторизованный подход? - PullRequest
0 голосов
/ 04 февраля 2019

Я создаю новые столбцы на основе некоторых данных из другого фрейма данных и некоторых данных из фрейма данных, которые я хочу расширить.

У меня есть рабочее решение, но мне интересно узнать, существует ли векторизованный подход, поскольку в настоящее время требуется довольно много времени, чтобы использовать метод pandas.apply () (который перебирает строки под капотом).

Функция, которая выполняет преобразование:

import pandas as pd


def add_new_columns(row, **kwds):
    participant = row['participant']
    time = row['time']

    ### NOTE ###
    # There is some other code here which handles cases where other
    # dataframe does not contain information, in that case we impute

    return pd.Series(kwds['other_df'].loc[participant, time])

иоператор, который вызывает вышеуказанную функцию:

main_df = pd.merge(
    main_df,
    main_df.apply(
        add_new_columns,
        axis=1,
        other_df=other_df
    ),
    left_index=True,
    right_index=True
)

Базовый пример некоторых наборов данных, которые будут работать с вышеуказанным кодом:

main_df = pd.DataFrame(
    [
        ['001', 'P1', 3, 'jumped'],
        ['002', 'P3', 8, 'yawned'],
        ['004', 'P2', 7, 'made something up']
    ],
    columns=['id', 'participant', 'time', 'action']
).set_index('id')

other_df = pd.DataFrame(
    [
        ['P1', 3, 2, 9, 8],
        ['P3', 8, 5, 6, 3],
        ['P2', 7, 9, 8, 5]
    ],
    columns=['participant', 'time', 'sugar-levels', 'some-other-measure', 'some-other-measure2']
).set_index(['participant', 'time'])

Мои данные имеют длину 800 000 строк.Я хотел бы избежать итерации, если это возможно.Есть ли в пандах другие методы, которые могут помочь?

1 Ответ

0 голосов
/ 04 февраля 2019

Вы в основном пытаетесь присоединиться other_df к main_df на participant и time.Не зная вашей логики вменения, трудно дать полный ответ, но вы можете сначала объединить other_df следующим образом:

merged_df = pd.merge(main_df, other_df, how='left', on=['participant','time'])

и затем заполнить пропущенные значения в столбце sugar-levels в merged_dfиспользуя метод вменения по вашему выбору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...