#pandas
Вопрос:
Как я могу создать фрейм данных с общим ключом, но другим значением?
import pandas as pd
A = {"ID":["A", "B","C"], "Weight":[500,300,200]}
B = {"ID":["A", "B","D"], "Weight":[500,100,100]}
dfA = pd.DataFrame(data=A)
dfB = pd.DataFrame(data=B)
dfC = dfA.merge(dfB, how='outer', left_on=['ID'], right_on=['ID'])
dfC
Выходной ток составляет:
ID Weight_x Weight_y
0 A 500.0 500.0
1 B 300.0 100.0
2 C 200.0 NaN
3 D NaN 100.0
Но мой ожидаемый результат (идентификатор-общий ключ, поэтому A-идентичное значение, но C и D не являются общим элементом):
ID Weight_x Weight_y
0 B 300.0 100.0
Комментарии:
1. Как получилось
C
, что иD
не содержит других значений, или вы можете рассмотреть возможность отрицанияnan
значений во время вычисления?2. Если у вас есть значения nan
Weight
как для dfA, так и для dfB, будут ли они считаться равными?3. Я думаю, вы хотите
inner
объединить, чтобы он объединялся по идентификатору, но затем добавьте aquery
, чтобы сохранить только строки, в которых вес отличается.4. Идентификатор-это ключ для проверки общего или нет, поэтому C и D будут удалены, так как они не являются общими в обоих df.
Ответ №1:
Используйте простой merge
параметр по умолчанию how='inner'
, как предлагает @ALollz, и query
сохраняйте разные weight
значения:
>>> pd.merge(dfA, dfB, on='ID').query("Weight_x != Weight_y")
ID Weight_x Weight_y
1 B 300 100
Комментарии:
1. спасибо, это на базе dfC, есть ли лучшее решение напрямую от dfA и dfB?
2. Теперь решение основано на dfA и dfB.