Поиск pandas по нескольким столбцам возвращает один столбец, если совпадаетPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Поиск pandas по нескольким столбцам возвращает один столбец, если совпадает

Сообщение Anonymous »

Пример данных:

Код: Выделить всё

df1 = pd.DataFrame({
'a': [1, 6, 3, 9],
'b': ['A', 'B', 'C', 'D'],
'c': [10, 20, 30, 40],
'd': [100, 200, 300, 400]
})

df2 = pd.DataFrame({
'm': [1, 5, 3, 7],
'n': [2, 6, 8, 4],
'o': [9, 10, 11, 12]
})
Требование:

Код: Выделить всё

df1['a']
может встречаться в любом месте df2. Я хочу вернуть df2['m'] независимо от того, где найдено совпадение.
После некоторого поиска в Google и чата я обнаружил плавление df2 и слияние с df1 полезен, за исключением того, что он не проверяет совпадение в df2['m'].
Код:< /p>

Код: Выделить всё

df2_melted = df2.melt(id_vars=['m'], value_vars=['n', 'o'])
merged_df = df1.merge(df2_melted, left_on='a', right_on='value', how='left')
df1['e'] = merged_df['m']
print(df1)
Выход:

Код: Выделить всё

a  b   c    d    e
1  A  10  100  NaN     # df1['a'] == df2['m']
6  B  20  200  5.0     # df1['a'] == df2['n']
3  C  30  300  NaN     # df1['a'] == df2['m']
9  D  40  400  1.0     # df1['a'] == df2['o']
Обязательный вывод:

Код: Выделить всё

a  b   c    d  e
1  A  10  100  1
6  B  20  200  5
3  C  30  300  3
9  D  40  400  1
Если бы df2['m'] можно было также добавить к value_vars во время плавления, это решило бы проблему. Я попробовал, не сработало. Затем проверил документацию и обнаружил, что все, что есть в id_vars, оставшееся или его подмножество может быть частью value_vars. Так что этот подход может быть неверным или я что-то упускаю.
Тогда я подумал, если df1['a'] соответствует df2['m'], тогда df1['e'] == df1['a'] == df2['m']. Поэтому простая замена значения NaN на df1['a'] должна сработать, и это сработало. Но пришлось преобразовать столбец в int; из-за NaN оно изменилось на плавающее.
Рабочий полный код:

Код: Выделить всё

df2_melted = df2.melt(id_vars=['m'], value_vars=['n', 'o'])
merged_df = df1.merge(df2_melted, left_on='a', right_on='value', how='left')
df1['e'] = merged_df['m']
df1['e'] = (df1['e'].fillna(df1['a'])).astype(int)
Казалось, что хотя это и рабочее решение, оно излишне сложное: «попробуйте любое решение: добавьте больше кода, чтобы исправить проблемы по мере продвижения, не меняя исходное решение».
Есть ли другой лучший подход, который может помочь с моим требованием?

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

Подробнее здесь: https://stackoverflow.com/questions/790 ... if-matches
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Группировать по столбцам и распределять значения по нескольким столбцам на основе значения [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Как применить функцию к нескольким столбцам в DataFrame Pandas за один раз
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как выполнить поиск по нескольким столбцам в MySQL с частичным совпадением (?), Аналогично строке поиска?
    Anonymous » » в форуме JAVA
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Pandas `.assign` нескольким столбцам из одной функции
    Anonymous » » в форуме Python
    0 Ответы
    95 Просмотры
    Последнее сообщение Anonymous
  • Доступ к нескольким столбцам в Pandas (PYTHON)
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»