Pandas: удалить дубликаты удаляет данные при объединении фреймов данных с индексом DateTime - PullRequest
1 голос
/ 25 февраля 2020

У меня есть 2 кадра данных (некоторые значения дублируются, например, 2020-02-13):

>>> print(df1)
                   Val
Date                
2020-02-20         152.50
2020-02-19         152.53
2020-02-18         152.20
2020-02-13         152.28

>>> print(fd2)
                   Val
Date                
2018-02-20         141.40
2018-02-21         141.37
2018-02-22         141.17
2018-02-26         141.35
2018-02-27         140.69
...                   ...
2020-02-05         152.37
2020-02-06         152.20
2020-02-10         152.03
2020-02-11         151.19
2020-02-13         152.28
[298 rows x 1 columns]

оба проиндексированы по дате (df1.set_index ('Date')), и даты обоих кадров данных были проанализирован (pd.to_datetime (df1.index)). Теперь я хочу объединить их и удалить дубликаты (если есть). Я попытался

>>> pd.concat([df1, df2])
                   Val
Date                
2018-02-20         141.40
2018-02-21         141.37
2018-02-22         141.17
2018-02-26         141.35
2018-02-27         140.69
...                   ...
2020-02-13         152.28
2020-02-20         152.50
2020-02-19         152.53
2020-02-18         152.20
2020-02-13         152.28
[302 rows x 1 columns]

, и я получил новый df с дубликатами (2020-02-13). Тем не менее, при запуске

>>>pd.concat([df1, df2]).drop_duplicates()
                   Val
Date                
2018-02-20         141.40
2018-02-21         141.37
2018-02-22         141.17
2018-02-26         141.35
2018-02-27         140.69
...                   ...
2020-02-06         152.20
2020-02-10         152.03
2020-02-11         151.19
2020-02-13         152.28
2020-02-20         152.50
[299 rows x 1 columns]

он удаляет деликатесы, а также некоторые значения (2020-02-18 и 2020-02-19). Есть идеи почему? и как правильно объединять 2 фрейма данных, проиндексированных по дате?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Образец:

print (df1)
               Val
Date              
2020-02-20  152.50
2020-02-19  152.53
2020-02-18  152.20
2020-02-13  152.28

print (df2)
               Val
Date              
2018-02-20  152.53
2018-02-21  141.37
2020-02-13  152.28

Если объединить:

print (pd.concat([df1, df2]))
               Val
Date              
2020-02-20  152.50
2020-02-19  152.53
2020-02-18  152.20
2020-02-13  152.28
2018-02-20  152.53
2018-02-21  141.37
2020-02-13  152.28

Ваше решение удаляет только дубликаты по всем столбцам, здесь Val столбец, индекс не проверяется:

df3 = pd.concat([df1, df2]).drop_duplicates()
print (df3)
               Val
Date              
2020-02-20  152.50
2020-02-19  152.53 <-dupe
2020-02-18  152.20
2020-02-13  152.28 <-dupe
2018-02-21  141.37

Если преобразовать DatetimeIndex в столбец, удаляются дубликаты по всем столбцам, здесь Date и столбцу Val:

df4 =  pd.concat([df1, df2]).reset_index().drop_duplicates()
print (df4)
        Date     Val
0 2020-02-20  152.50
1 2020-02-19  152.53 <-not dupe, different datetime
2 2020-02-18  152.20
3 2020-02-13  152.28 <-dupe
4 2018-02-20  152.53 <-not dupe, different datetime
5 2018-02-21  141.37

Если необходимо удалить дубликаты с помощью DatetimeIndex, используйте только

df5 = pd.concat([df1, df2])
df5 = df5[~df5.index.duplicated()]
print (df5)
Date              
2020-02-20  152.50
2020-02-19  152.53
2020-02-18  152.20
2020-02-13  152.28 <-dupe
2018-02-20  152.53
2018-02-21  141.37

Или удалить дубликаты по столбцу Date, указанному в параметре subset:

df51 = pd.concat([df1, df2]).reset_index().drop_duplicates(subset=['Date'])
print (df51)
        Date     Val
0 2020-02-20  152.50
1 2020-02-19  152.53
2 2020-02-18  152.20
3 2020-02-13  152.28 <-dupe
4 2018-02-20  152.53
5 2018-02-21  141.37
0 голосов
/ 25 февраля 2020

Способен ли verify_integrity метод pandas ' concat добиться цели? В вашем случае это будет выглядеть так:

df = pd.concat([df1, df2], verify_integrity=true)
...