#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)