Сравните 2 кадра данных Pandas, возвращает неправильные значения - PullRequest
1 голос
/ 22 октября 2019

Есть 2 dfs

типы данных одинаковы

df1 =

ID city      name    value
1  LA        John    111
2  NY        Sam     222
3  SF        Foo     333
4  Berlin    Bar     444

df2 =

ID  city      name   value
1   NY        Sam    223
2   LA        John   111
3   SF        Foo    335
4   London    Foo1   999
5   Berlin    Bar    444

Мне нужно сравнить их и создать новый df, только со значениями, которые находятся в df2, но не в df1

По некоторым причинам результаты после применения различных методов неверны

До сих пор я пытался

pd.concat([df1, df2],  join='inner', ignore_index=True)

, но он возвращает все значения вместе

pd.merge(df1, df2, how='inner')

возвращает df1

, затем этот

df1[~(df1.iloc[:, 0].isin(list(df2.iloc[:, 0])))

возвращает df1

Требуемый вывод

ID city      name    value
1   NY        Sam    223
2   SF        Foo    335
3   London    Foo1   999

Ответы [ 2 ]

4 голосов
/ 22 октября 2019

Используйте DataFrame.merge во всех столбцах без первого и indicator параметр:

c = df1.columns[1:].tolist()

Или:

c = ['city', 'name', 'value']

df = (df2.merge(df1,on=c, indicator = True, how='left', suffixes=('','_'))
       .query("_merge == 'left_only'")[df1.columns])

print (df)
   ID    city  name  value
0   1      NY   Sam    223
2   3      SF   Foo    335
3   4  London  Foo1    999
0 голосов
/ 22 октября 2019

Попробуйте это:

print("------------------------------")
print(df1)

df2 = DataFrameFromString(s, columns)
print("------------------------------")
print(df2)

common = df1.merge(df2,on=["city","name"]).rename(columns = {"value_y":"value", "ID_y":"ID"}).drop("value_x", 1).drop("ID_x", 1)
print("------------------------------")
print(common)

ВЫХОД:

------------------------------
   ID    city  name  value
0  ID    city  name  value
1   1      LA  John    111
2   2      NY   Sam    222
3   3      SF   Foo    333
4   4  Berlin   Bar    444
------------------------------
   ID    city  name  value
0   1      NY   Sam    223
1   2      LA  John    111
2   3      SF   Foo    335
3   4  London  Foo1    999
4   5  Berlin   Bar    444
------------------------------
     city  name  ID  value
0      LA  John   2    111
1      NY   Sam   1    223
2      SF   Foo   3    335
3  Berlin   Bar   5    444
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...