在时间序列索引下连接pandas数据框而不重复列

1 投票
2 回答
2762 浏览
提问于 2025-04-18 06:24

我想把两个 pandas 数据框(DataFrame)合并在一起,这两个数据框都有时间序列的索引,可能会有重叠的部分,而且它们的列名也可能会重复。

举个例子:

    old_close                                   new_close
             1TM    ABL  ...                    ABL    ANG    ...
Date                                Date
2009-06-05  100     564             1990-06-08  120    2533   
2009-06-04  102     585             1990-06-05  121    2531
2009-06-03  101     532             1990-06-04  123    2520
2009-06-02  99      540             1990-06-03  122    2519
2009-06-01  99      542             1990-06-02  121    2521
...

我想把 old_close 和 new_close 合并成一个新的数据框,这个新数据框要包含两个数据框里的所有数据,但要排除所有重复的索引值。

到目前为止,我是这样做的:

merged_close = pd.concat([old_close, new_close], axis=1)

但是这样做会导致出现重复的列(在轴 0 上是重复的行)和一个多重索引。

2 个回答

0

来自 Pandas 文档

concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
       keys=None, levels=None, names=None, verify_integrity=False)

verify_integrity:这是一个布尔值,默认是 False。这个参数用来检查新合并的轴(数据的某个维度)是否包含重复项。相较于实际的数据合并,这个检查可能会消耗很多资源。

你有没有试过把这个参数设置为 True

编辑:

抱歉,verify_integrity 如果发现有重复项会直接报错。无论如何,你可以试试 drop_duplicates() 这个函数。

顺便看看这个问题:

python pandas 删除重复列

2

假设你想要“排除两个索引上的所有重复值”,那么这个方法应该可以用

unique_indices = np.setdiff1d(np.unioin1d(old_close.index.to_list(), new_close.index.to_list()), 
                              np.intersect1d(old_close.index.to_list(), new_close.index.to_list()))
merged_close = pd.concat([old_close, new_close]).ix[unique_indices]

编辑:更新了唯一索引的计算。现在所有重复的索引都被去掉了

撰写回答