Как объединить два столбца из разных фреймов данных, и если совпадение найдено, напишите «True» в новом столбце, используя pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я работаю над проектом pandas. У меня есть два фрейма данных, похожие на приведенные ниже

 DF1 :

Data1    Data2      Data3
Head     Cat        Fire
Limbs    Dog        Snow
Eyes     Fish       Water
Mouth    Dragon     Air


DF2 :

 Data1     Data2      
 Limbs     Dog        
 Mouth     Dragon        
 Head      Cat 
  

На основе приведенного выше фрейма данных мне нужно сравнить оба DF, и если совпадение найдено, мне нужно написать «True» в отдельном столбце, иначе False

пример: допустим, я выбираю первую строку DF2 с комбинацией (конечности, собака), которую следует искать в DF1, так как мы видим, что комбинация завершается во 2-й строке, затем запишите значение DF1 Data3 «Снег» в значение DF2 Data3. а также выведите значение «True» в новом столбце, если совпадение найдено.

ожидаемый результат

 Data1         Data2         Data3   Data4
 Limbs        Dog            Snow    True
 Mouth        Dragon         Air     True
 Head         cat            Fire    True
  Eyes         Fish         Water    False
  

В настоящее время я попытался объединить два фрейма данных

Текущий код :

 df3 = pd.merge(df, valid_req , on=['Data1','Data2' ])

df3


 Data1         Data2         Data3  
     Limbs        Dog            Snow   
     Mouth        Dragon         Air     
     Head         cat            Fire
  

Как я могу добиться ожидаемого результата?

Ответ №1:

Используйте DataFrame.merge с левым соединением и indicator=True параметром, а затем для нового столбца сравните both с DataFrame.pop для удаления столбца:

 df = df1.merge(df2, on=['Data1', 'Data2'], how='left', indicator=True)
df['Data4'] = df.pop('_merge').eq('both')
print (df)
   Data1   Data2  Data3  Data4
0   Head     Cat   Fire   True
1  Limbs     Dog   Snow   True
2   Eyes    Fish  Water  False
3  Mouth  Dragon    Air   True
  

Комментарии:

1. Кажется, это работает ! , но допустим, у меня есть и другие столбцы в таблице, как их сохранить? этот код фактически не сохраняет их

2. @Divakar — Должно быть, какие столбцы опущены? Из первого или из второго фрейма данных?

3. @jezrael Отличное использование indicator аргументов. Я не знал, что это существует. Итак, я предоставил решение с tmp помощью column. 1.

4. это сработало и с другими столбцами, это исправление работает отлично!! Спасибо @jezrael и всем 🙂

Ответ №2:

Вы можете назначить временный столбец df2 , а затем merge использовать how='left' :

 In [1665]: df2['tmp'] = 1

In [1668]: x = df1.merge(df2, on=['Data1', 'Data2'], how='left')

In [1667]: x
Out[1667]: 
   Data1   Data2  Data3  tmp
0   Head     Cat   Fire  1.0
1  Limbs     Dog   Snow  1.0
2   Eyes    Fish  Water  NaN
3  Mouth  Dragon    Air  1.0
  

Наконец, используйте numpy.where для назначения нового столбца Data4 на основе if x['tmp'] == 1 then True , else False :

 In [1668]: import numpy as np

In [1669]: x['Data4'] = np.where(x.tmp.eq(1), True, False)
  

Удалите ненужный tmp столбец с помощью df.drop . Тогда x ваш конечный результат:

 In [1671]: x.drop('tmp', 1, inplace=True)

In [1672]: x
Out[1672]: 
   Data1   Data2  Data3  Data4
0   Head     Cat   Fire   True
1  Limbs     Dog   Snow   True
2   Eyes    Fish  Water  False
3  Mouth  Dragon    Air   True
  

Ответ №3:

Просто используйте функцию apply для DF1 для создания Data4:

 import pandas as pd

DF1 = pd.DataFrame([
    ["Head", "Cat", "Fire"],
    ["Limbs", "Dog", "Snow"],
    ["Eyes", "Fish", "Water"],
    ["Mouth", "Dragon", "Air"]
], columns=["Data1", "Data2", "Data3"])

DF2 = pd.DataFrame([
    ["Limbs", "Dog", "Snow"],
    ["Mouth", "Dragon", "Air"],
    ["Head", "Cat", "Fire"]
], columns=["Data1", "Data2", "Data3"])

DF1["Data4"] = DF1["Data1"].apply(lambda cell: DF2[DF2["Data1"]==cell]["Data1"].count()>0)