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

У меня есть основной фрейм данных df и другой фрейм данных ext_map:

df = pd.DataFrame(data={'true': [1, 2, 3], 'billed': [4, 5, 6], 'genre':['a','b','c']})

    true    billed  genre
0    1         4    a
1    2         5    b
2    3         6    c

ext_map = pd.DataFrame(data={'label':[1,2,3], 'a':[1.1,1.2,1.3], 'b':[2.1,2.2,2.3],'c':[3.1,3.2,3.3]})

    label   a   b   c
0    1      1.1 2.1 3.1
1    2      1.2 2.2 3.2
2    3      1.3 2.3 3.3

Я хочу создать новый столбец new_col в моем основном фрейме данных, чтобы для каждой строки в df Я хочу получить значение из столбцов a, b, c из ext_map на основе row.genre и row.true совпадает с меткой ext_map.

[Ожидается]

    true    billed  genre new_col
0    1         4      a     1.1
1    2         5      b     2.3
2    3         6      c     3.3

1 Ответ

2 голосов
/ 05 мая 2020

Похоже, вы должны иметь возможность присоединиться к измененной версии ext_map до df, чтобы сделать это. Здесь есть хорошая документация: https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html

Примерный пример (возможно, есть более краткий способ сделать это):

Вы можете развернуть данные из широкого формата в длинный формат (перечисление каждой комбинации true и genre) с использованием pd.melt()

temp = ext_map.melt(id_vars=['label'], value_vars=['a', 'b', 'c'], var_name='genre', value_name = 'new_col')

, что дает следующий результат:

   label     genre  new_col
0      1        a      1.1
1      2        a      1.2
2      3        a      1.3
3      1        b      2.1
4      2        b      2.2
5      3        b      2.3
6      1        c      3.1
7      2        c      3.2
8      3        c      3.3

Затем используйте pd.merge() для присоединитесь к фреймам данных, используя метод поиска, который вы упомянули:

df.merge(temp, left_on = ['true', 'genre'], right_on = ['label', 'variable'])

, что даст вам этот результат:

   true  billed genre  label variable  new_col
0     1       4     a      1        a      1.1
1     2       5     b      2        b      2.2
2     3       6     c      3        c      3.3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...