Pandas:删除重复项会在将数据帧与DateTime索引连接时删除数据



我有两个数据帧(有些值重复,例如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]

它删除了duplicates,但也删除了一些值(2020-02-18和2020-02-19(。知道为什么吗?将2个按日期索引的数据帧连接起来的正确原因是什么?

示例:

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

或通过subset参数中指定的列Date删除重复项

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

熊猫的concat方法的verify_integrity选项成功了吗?在你的情况下,它看起来是这样的:

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

最新更新