Как эффективно go над значениями столбца в одном кадре данных и найти строку, в которой значение встречается в другом кадре данных? - PullRequest
0 голосов
/ 02 марта 2020

У меня есть 2 Pandas фреймов данных.

df1:
   stringColumn
0     see ya
1     yo
2     mkey


df2:
    name       alias1      alias2
0  goodbye    see ya      bye
1  OK          cool        mkey
2  hello       hey         yo

Я хотел бы эффективным способом go через значения столбцов в df1 ['stringColumn'], найти Индекс строки, где значение из df1 встречается в df2 и обменивается им с соответствующим значением из столбцов df2 ['name'].

Конечный результат будет:

df1:
   stringColumn
0     goodbye
1     hello
2     OK

В настоящее время Я делаю:

    for index, row in df1.iterrows():
        row['stringColumn'] = df2[df2.apply(lambda rowAlias: rowAlias.astype(str).str.contains(row['stringColumn'], case=False).any(), axis=1)]['name'].values[0]

Это работает, но очень медленно, особенно потому, что у меня ~ 5000 строк в df1 и около 100 строк и 10 столбцов в df2.

Должно быть что-то попроще и быстрее, чем это чудовище.

Ответы [ 2 ]

0 голосов
/ 02 марта 2020
import pandas as pd

df1 = pd.DataFrame(data={'c11':[1,2,3]})
df2 = pd.DataFrame(data={'c21':[11,12,13], 'c22':[1,2,3]})

df1.loc[df2['c22']==df1['c11'],'c11'] = df2['c21']

df2 ['c22'] == df1 ['c11'] это условие для проверки значений столбцов df1 и df2, а 'c11' - новый столбец, созданный в df1 методом lo c и RHS значение присваивается этому столбцу. Это решение не будет работать, если длины столбцов df1 и df2 различны. Это приведет к ошибке. Upvote, если это полезно.

0 голосов
/ 02 марта 2020

Вы можете сделать merge после melt

s=df1.merge(df2.melt('name'),left_on='stringColumn',right_on='value',how='left')[['stringColumn','name']]
s
  stringColumn     name
0        seeya  goodbye
1           yo    hello
2         mkey       OK
...