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