Назначьте значение столбца фрейма данных, где столбцы двух фреймов данных равны - PullRequest
1 голос
/ 20 июня 2020

У меня 2 фрейма данных. Я хочу назначить value of df1.column1 = df2.column1 where df1.column2 == df2.column2 and df1.column3 == df2.column3 and df1.column4 == df2.column4.

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

def f(x):
  for row in df2.iloc:
    if x['name'] == row['name'] and x['age'] == row['age'] and x['gender'] == row['gender']:
      return row['occupation']

df1['occupation'] = df1.apply(f, axis=1)

Ответы [ 2 ]

1 голос
/ 20 июня 2020

В итоге я использовал метод ниже.

  def f(x):
          row = df1.loc[(df1['name'] == x['name']) & (df1['age'] == x['age']) & (df1['gender'] == x['gender'])]
          return row['occupation'].item()

  df2['occupation'] = df2.apply(f, axis=1)
1 голос
/ 20 июня 2020

Один из способов сделать это - найти, где они все равны, и использовать индексирование .lo c для замены значений в соответствующих местах

idx = (df1.name == df2.name) & (df1.age == df2.age) & (df1.gender == df2.gender)
df1.loc[idx, 'occupation'] = df2.loc[idx, 'occupation']

Вот демонстрация того, как это работает.

df1

   A  B  C  D
0  a  b  1  x
1  b  a  2  r
2  a  c  3  q

df2

     A  B  C    D
0    a  b  1  fff
1  NaN  a  2  ggg
2    a  c  3  hhh

Найдите, где A и B равны, и замените столбец D в df1 на столбец D в df2:

idx = (df1.A == df2.A) & (df1.B == df2.B)
df1.loc[idx, 'D'] = df2.loc[idx, 'D']

df1

   A  B  C    D
0  a  b  1  fff
1  b  a  2    r
2  a  c  3  hhh

Для вашего следующего поста, пожалуйста, обратитесь к этому руководству о том, как создать минимально воспроизводимый образец кода .

------ РЕДАКТИРОВАТЬ -----

Если df2 имеет меньше строк, чем df1, то вышеуказанный метод не будет работать. В этом случае вы можете сделать:

df2

     A  B  C    D
0    a  b  1  fff
1  NaN  a  2  ggg

Затем

dfm = df1[df1.index.isin(df2.index)]
idx = (dfm.A == df2.A) & (dfm.B == df2.B)
dfm.loc[idx, 'D'] = df2.loc[idx, 'D']
df1 = dfm.combine_first(df1)

df1

   A  B    C    D
0  a  b  1.0  fff
1  b  a  2.0    r
2  a  c  3.0    q
...