Python Pandas - 合并DataFrame,保留索引

时间:2013-09-05 04:45:33

标签: python merge pandas

我要做的是基本上在Pandas中合并两个DataFrame对象,同时保留索引(DateTimeIndex)。 mergeordered_merge都不支持此功能。 假设我有这样构建的股票数据:

from pandas.io.data import DataReader
from datetime import datetime
aapl_old = DataReader('AAPL', 'yahoo', datetime(2013,1,1), datetime(2013,3,1))
aapl_new = DataReader('AAPL', 'yahoo', datetime(2013,2,1), datetime(2013,4,1))

如何在索引完整的情况下获得最终合并的DataFrame

到目前为止我尝试过(并且不起作用):

  • 任何类型的merge操作 - 据我所知,根本不支持在多对多数据上保留索引

  • 索引切片的一些变体:

    aapl_new.ix[aapl_new.ix > aapl_old.ix[-1]]
    aapl_new.ix[aapl_new.ix > aapl_old.ix[-1].name]
    

我认为我可以解决这个问题:

  • 不同版本的索引切片 - 我接近这个错误的方式吗?
  • reset_index()reindex()操作 - reindex()部分遇到很多问题。
  • 查找aapl_new的唯一索引以及append aapl_old的索引 - 不知道如何查找aapl_new中哪些行未显示在aapl_old

如果我需要提供更多信息,请告诉我。

2 个答案:

答案 0 :(得分:2)

如果我理解你的要求(但这不是很清楚),我想你想要以下内容。

首先,要合并两个数据帧,您只需使用concat([aapl_old, aapl_new])连接两个数据帧(这将保留索引)。但要删除重复项,您可以考虑两种策略:

1)您只能从aapl_new中连接那些唯一的(不会出现在aapl_old中)。要选择这些,您可以:

aapl_new[~aapl_new.index.isin(aapl_old.index)]

然后你可以用aapl_old结束:

>>> aapl_new_unique = aapl_new[~aapl_new.index.isin(aapl_old.index)]
>>> pd.concat([aapl_old, aapl_new_unique])

2)您也可以只连接数据帧,然后删除重复的行:

>>> aapl_all = pd.concat([aapl_old, aapl_new])
>>> aapl_all.drop_duplicates()

答案 1 :(得分:1)

  • 创建第一个数据框
  • df.append(new_dataframe)#假设结构正确

然后,您可以使用drop_duplicates()方法删除dupes(如果存在)。