Создайте фрейм данных с тем же ключом, но другим значением

#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 объединить, чтобы он объединялся по идентификатору, но затем добавьте a query , чтобы сохранить только строки, в которых вес отличается.

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.