Изменить значения одного фрейма данных, используя другой фрейм данных в качестве запроса - PullRequest
0 голосов
/ 18 января 2019
df1 = pd.DataFrame(data={'name': ["John", "Mark", "Alice", "Alice"], 'age': [18, 23, 23, 27], 'luckynumber': [10, 20, 30, 40]})
df2 = pd.DataFrame(data={'name': ["Alice"], 'age': ['23']})

>>> df1
   age  luckynumber   name
0   18           10   John
1   23           20   Mark
2   23           30  Alice
3   27           40  Alice

>>> df2
  age   name
0  23  Alice

Я хотел бы установить luckynumber для df1 записей, которые соответствуют df2 на -1. Я не хочу менять макет df1. Я надеялся, что что-то вроде df1[df2]['luckynumber'] = -1 сработает, но это не так.

Ожидаемый результат будет:

>>> df1
   age  luckynumber   name
0   18           10   John
1   23           20   Mark
2   23           -1  Alice
3   27           40  Alice

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вероятно, не самое оптимальное решение, но это работает

  1. Создайте столбец индикатора с именем value, который указывает, когда было совпадение.

  2. Объединить два кадра данных на основе ключей age и name

  3. Затем используйте np.where, чтобы условно проверить, было ли совпадение, и измените значение столбца luckynumber

df2['value'] = 1

df3 = pd.merge(df1, df2, left_on=['age', 'name'], right_on=['age', 'name'], how='left')

df3['luckynumber'] = np.where(df3.value == 1, -1, df1.luckynumber)

df3.drop('value', axis=1, inplace=True)

Выход:

    age luckynumber name
0   18  10          John
1   23  20          Mark
2   23  -1          Alice
3   27  40          Alice
0 голосов
/ 18 января 2019

Сначала преобразуйте столбец age для целочисленных столбцов в обоих кадрах данных, затем merge с параметром indicator=True с левым соединением и проверьте both для логической маски, последнее установленное значение равно DataFrame.loc:

df2['age'] = df2['age'].astype(int)

mask = df1.merge(df2, how='left', indicator=True)['_merge'] == 'both'

df1.loc[mask, 'luckynumber'] = -1
print (df1)
    name  age  luckynumber
0   John   18           10
1   Mark   23           20
2  Alice   23           -1
3  Alice   27           40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...