在datetime索引和列上合并两个数据帧

时间:2017-09-11 16:05:27

标签: python pandas

我有两个这样的数据框:

date1 = pd.date_range('1/1/2011', periods=3, freq='8H')
date2 = pd.date_range('1/1/2011', periods=2, freq='12H')
df1 = pd.DataFrame({'cat1': ['1', '1', '2']}, index = date1)
df2 = pd.DataFrame({'cat1': ['1', '2'],
                    'cat2': ['111', '222']}, index = date2)
df1.index = df1.index.map(lambda x: x.to_pydatetime().date())
df2.index = df2.index.map(lambda x: x.to_pydatetime().date())

他们看起来像这样:

print(df1)
print(df2)

           cat1
2011-01-01    1
2011-01-01    1
2011-01-01    2
           cat1 cat2
2011-01-01    1  111
2011-01-01    2  222

我想在datetime索引和cat1列上合并它们。我想得到这个:

           cat1 cat2
2011-01-01    1  111
2011-01-01    1  111
2011-01-01    2  222

我试图通过使用:

来实现这一点
df3 = df1.merge(df2, how='inner', right_index=True, left_index=True, on='cat1')

但是,相反,我得到了这个:

           cat1 cat2
2011-01-01    1  111
2011-01-01    1  222
2011-01-01    1  111
2011-01-01    1  222
2011-01-01    2  111
2011-01-01    2  222

我确信我在我面前忽略了一些东西,但我无法理解。

我实际上过度简化了上述方案,因此解决方案无法解决我的实际问题。在我的实际问题中,我有更多的约会。

以下更准确地代表了我的实际问题:

date1 = pd.DatetimeIndex(['2017-05-14', '2017-05-14', '2017-05-14', '2017-05-15'])
date2 = pd.DatetimeIndex(['2017-05-14', '2017-05-15', '2017-05-14', '2017-05-15'])
df1 = pd.DataFrame({'cat1': ['200', '200', '200', '100']}, index = date1)
df2 = pd.DataFrame({'cat1': ['200', '200', '100', '100'],
                    'cat2': ['111', '222', '333', '444']}, index = date2)

df3 = df1.merge(df2, how='inner', left_index=True, right_index=True, on='cat1')

print(df1)
print(df2)
print(df3)

           cat1
2017-05-14  200
2017-05-14  200
2017-05-14  200
2017-05-15  100
           cat1 cat2
2017-05-14  200  111
2017-05-15  200  222
2017-05-14  100  333
2017-05-15  100  444
           cat1 cat2
2017-05-14  200  111
2017-05-14  200  222
2017-05-14  200  111
2017-05-14  200  222
2017-05-14  200  111
2017-05-14  200  222
2017-05-15  100  333
2017-05-15  100  444

但是,对于df3,我希望得到这个:

           cat1 cat2
2017-05-14  200  111
2017-05-14  200  111
2017-05-14  200  111
2017-05-15  100  444

谢谢!

1 个答案:

答案 0 :(得分:1)

几乎就在那里!

df3 = df1.merge(df2, how='inner', right_index=True, left_index=False, on='cat1')

注意left_index kwarg:)

更一般地说,您可能需要重置/设置索引,因此您可以根据索引或列进行连接,而不必混合使用两者。这应该适用于一般情况(现在您只是在两个不同的列上执行连接,删除两个索引):

df3 = pd.merge(df1.reset_index(), df2.reset_index(), on=['index','cat1']).set_index('index')

这是相同的,与之前的解决方案更相似

df3 = df1.reset_index().merge(df2.reset_index(), on=['index','cat1']).set_index('index')