Создание столбцов в фрейме данных с использованием данных из другого фрейма данных с условиями без использования циклов for - PullRequest
0 голосов
/ 02 июля 2018

У меня есть два кадра данных, df_1 и df_2

df_1 имеет 30k + строк и выглядит так

Col_1_1    Col_1_2    CA_CB
a          c          CA
a          c          CB
a          d          CA
b          c          CA
b          d          CB
b          d          CB
b          c          CA

Я хотел бы создать два столбца в df_1, используя данные, поступающие из df_2, если столбец CA_CB = "CB"

df_2 имеет 1 тыс. Строк и выглядит следующим образом (Col_2_1 имеет уникальные значения)

Col_2_1    Col_2_2
a          data on a
b          data on b
c          data on c
d          data on d

Мой вывод должен выглядеть так:

Col_1_1    Col_1_2    CA_CB    Col_target_1    Col_target_2
a          c          CA       "X"             "X"
a          c          CB       data on a       data on c
a          d          CA       "X"             "X"
b          c          CA       "X"             "X"
b          d          CB       data on b       data on d
b          d          CB       data on b       data on d
b          c          CA       "X"             "X"

В настоящее время я делаю то, что создаю Col_target_1 и Col_target_2 с

df_1["Col_target_1"] = "X"
df_2["Col_target_2"] = "X"

for i in range(len(df_1)):
    if df_1["CA_CB"][i] == "CB":
        for j in range(len(df_2)):
            if df_1["Col_1_1"][i] == df_2["Col_2_1"][j]:
                df_1["Col_target_1"][i] = df_2["Col_2_2"][j]
            if df_1["Col_1_2"][i] == df_2["Col_2_1"][j]:
                df_1["Col_target_2"][i] = df_2["Col_2_2"][j]

Это делает ту работу, которую я хочу. Но на это уходит более 20 минут, и мне было интересно, можно ли запустить его быстрее, используя другой метод.

Заранее спасибо.

1 Ответ

0 голосов
/ 02 июля 2018

Сначала создайте отображение серии из df_2:

s = df_2.set_index('Col_2_1')['Col_2_2']

Затем сопоставьте условно df_1, используя numpy.where:

mask = df_1['CA_CB'] == 'CB'

df_1['Col_target_1'] = np.where(mask, df_1['Col_1_1'].map(s), 'X')
df_1['Col_target_2'] = np.where(mask, df_1['Col_1_2'].map(s), 'X')

mask возвращает логический ряд, который np.where использует для поэлементного принятия решения о выборе второго или третьего аргумента.

...