Объединение двух фреймов данных и удаление дублирующихся строк с дублирующимися индексами (pandas) - PullRequest
0 голосов
/ 27 февраля 2020

Я прочитал разные посты с похожим вопросом, но не смог найти именно этот вопрос. У меня есть два pandas DataFrames, которые я хочу объединить. У них есть метки времени в качестве индексов. 2-й кадр данных в основном перекрывает 1-й, и поэтому они оба совместно используют строки с одинаковыми временными метками и значениями.

Я хотел бы удалить эти строки, поскольку они совместно используют все: индекс и значения в столбцах. Если они не разделяют как индекс, так и значения в столбцах, я хочу сохранить их.

Пока что могу отметить:

Index.drop_duplicate: это не то, что я ищу за. Он не проверяет значения в столбцах одинаковы. И я хочу сохранить строки с одинаковыми временными отметками, но разными значениями в столбцах индексы, я хочу сохранить их.

Чтобы привести пример, я повторно использую данные, приведенные в ответе ниже.

df1

                        Value
 2012-02-01 12:00:00     10
 2012-02-01 12:30:00     10
 2012-02-01 13:00:00     20
 2012-02-01 13:30:00     30

df2

                        Value
 2012-02-01 12:30:00     20
 2012-02-01 13:00:00     20
 2012-02-01 13:30:00     30
 2012-02-02 14:00:00     10

Результат, который я хотел бы получить, следующий:

                        Value
 2012-02-01 12:00:00     10  #(from df1)
 2012-02-01 12:30:00     10  #(from df1)
 2012-02-01 12:30:00     20  #(from df2 - same index than in df1, but different value)
 2012-02-01 13:00:00     20  #(in df1 & df2, only one kept)
 2012-02-01 13:30:00     30  #(in df1 & df2, only one kept)
 2012-02-02 14:00:00     10  #(from df2)

Пожалуйста, есть идеи? Спасибо за вашу помощь! Bests

1 Ответ

2 голосов
/ 27 февраля 2020

Предположим, что у вас есть 2 следующих кадра данных:

  1. df :

                     Date  Value
    0 2012-02-01 12:00:00     10
    1 2012-02-01 12:30:00     10
    2 2012-02-01 13:00:00     20
    3 2012-02-01 13:30:00     30
    4 2012-02-02 14:00:00     10
    5 2012-02-02 14:30:00     10
    6 2012-02-02 15:00:00     20
    7 2012-02-02 15:30:00     30
    
  2. df2 :

                     Date  Value
    0 2012-02-01 12:00:00     10
    1 2012-02-01 12:30:00     21
    2 2012-02-01 12:40:00     22
    3 2012-02-01 13:00:00     20
    4 2012-02-01 13:30:00     30
    

Чтобы получить результат, выполните:

pd.concat([df, df2]).sort_values('Date')\
    .drop_duplicates().reset_index(drop=True)

Результат для приведенных выше данных:

                 Date  Value
0 2012-02-01 12:00:00     10
1 2012-02-01 12:30:00     10
2 2012-02-01 12:30:00     21
3 2012-02-01 12:40:00     22
4 2012-02-01 13:00:00     20
5 2012-02-01 13:30:00     30
6 2012-02-02 14:00:00     10
7 2012-02-02 14:30:00     10
8 2012-02-02 15:00:00     20
9 2012-02-02 15:30:00     30

drop_duplicates отбрасывает дублирующиеся строки, сохраняя первый. Поскольку параметр subset не передан, критерием для обработки двух строк как дубликатов является идентичность всех столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...