Сравнение двух кадров данных и получение различий

У меня есть два кадра данных. Примеры:

df1:
Date       Fruit  Num  Color 
2013-11-24 Banana 22.1 Yellow
2013-11-24 Orange  8.6 Orange
2013-11-24 Apple   7.6 Green
2013-11-24 Celery 10.2 Green

df2:
Date       Fruit  Num  Color 
2013-11-24 Banana 22.1 Yellow
2013-11-24 Orange  8.6 Orange
2013-11-24 Apple   7.6 Green
2013-11-24 Celery 10.2 Green
2013-11-25 Apple  22.1 Red
2013-11-25 Orange  8.6 Orange

Каждый кадр данных имеет Дату как индекс. Оба кадра данных имеют ту же структуру.

То, что я хочу сделать, сравнивают эти два кадра данных и находят, какие строки находятся в df2, которые не находятся в df1. Я хочу сравнить дату (индекс) и первый столбец (Банан, Apple, и т.д.), чтобы видеть, существуют ли они в df2 по сравнению с df1.

Я попробовал следующее:

Для первого подхода я получаю эту ошибку: "Исключение: Может только сравнить тождественно маркированные объекты DataFrame". Я попытался удалить Дату как индекс, но получаю ту же ошибку.

На третьем подходе я заставляю утверждение возвращать False, но не могу выяснить, как на самом деле видеть различные строки.

Любые указатели приветствовались бы

60
задан 23 May 2017 в 15:26

4 ответа

Обновление и размещение, где-нибудь для других будет легче найти, , морской налим комментирует ответ jur выше.

df_diff = pd.concat([df1,df2]).drop_duplicates(keep=False)

Тестирование с этими кадрами данных:

df1=pd.DataFrame({
    'Date':['2013-11-24','2013-11-24','2013-11-24','2013-11-24'],
    'Fruit':['Banana','Orange','Apple','Celery'],
    'Num':[22.1,8.6,7.6,10.2],
    'Color':['Yellow','Orange','Green','Green'],
})

df2=pd.DataFrame({
    'Date':['2013-11-24','2013-11-24','2013-11-24','2013-11-24','2013-11-25','2013-11-25'],
    'Fruit':['Banana','Orange','Apple','Celery','Apple','Orange'],
    'Num':[22.1,8.6,7.6,10.2,22.1,8.6],
    'Color':['Yellow','Orange','Green','Green','Red','Orange'],
})

Результаты в этом: enter image description here

3
ответ дан 1 November 2019 в 10:29

Надежда это было бы полезно для Вас. ^o^

df1 = pd.DataFrame({'date': ['0207', '0207'], 'col1': [1, 2]})
df2 = pd.DataFrame({'date': ['0207', '0207', '0208', '0208'], 'col1': [1, 2, 3, 4]})
print(f"df1(Before):\n{df1}\ndf2:\n{df2}")
"""
df1(Before):
   date  col1
0  0207     1
1  0207     2

df2:
   date  col1
0  0207     1
1  0207     2
2  0208     3
3  0208     4
"""

old_set = set(df1.index.values)
new_set = set(df2.index.values)
new_data_index = new_set - old_set
new_data_list = []
for idx in new_data_index:
    new_data_list.append(df2.loc[idx])

if len(new_data_list) > 0:
    df1 = df1.append(new_data_list)
print(f"df1(After):\n{df1}")
"""
df1(After):
   date  col1
0  0207     1
1  0207     2
2  0208     3
3  0208     4
"""
0
ответ дан 1 November 2019 в 10:29

Я попробовал этот метод, и он работал. Я надеюсь, что это может помочь также:

"""Identify differences between two pandas DataFrames"""
df1.sort_index(inplace=True)
df2.sort_index(inplace=True)
df_all = pd.concat([df1, df12], axis='columns', keys=['First', 'Second'])
df_final = df_all.swaplevel(axis='columns')[df1.columns[1:]]
df_final[df_final['change this to one of the columns'] != df_final['change this to one of the columns']]
0
ответ дан 1 November 2019 в 10:29
# THIS WORK FOR ME

# Get all diferent values
df3 = pd.merge(df1, df2, how='outer', indicator='Exist')
df3 = df3.loc[df3['Exist'] != 'both']


# If you like to filter by a common ID
df3  = pd.merge(df1, df2, on="Fruit", how='outer', indicator='Exist')
df3  = df3.loc[df3['Exist'] != 'both']
0
ответ дан 1 November 2019 в 10:29

Другие вопросы по тегам:

Похожие вопросы: