我有两个这样的数据框:
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
谢谢!
答案 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')