我有两个df:
m2 =
2014-02 1
2014-09 1
2014-11 1
...
2016-11 10
2016-12 9
2017-01 9
2017-02 10
2017-04 2
Name: Start Date2, dtype: int64
m1 =
2010-09 1
2010-12 1
2011-03 1
2011-04 1
2011-05 2
...
2016-11 8
2016-12 12
2017-01 7
2017-02 5
2017-04 1
Name: Start Date, dtype: int64
我想要的是这样的单个df: merged =
2010-09 1 NaN
2010-12 1 NaN
...
2017-02 5 10
2017-04 1 2
我尝试了多个版本(它们是系列,所以我先将它们转换为数据帧):
result = pd.DataFrame(m1).reset_index().merge(pd.DataFrame(m2), left_on="Start Date", right_on="Start Date2", how='inner').set_index('index')
result.to_csv("out.csv", sep='\t', encoding='utf-8')
但我得到这样的东西:
2010-09 1 1
2010-09 1 1
...
2016-12 12 12
2016-12 12 12
2016-09 8 8
2016-11 8 8
如果我尝试使用outer
(这就是我想要的),我会得到:
2016-12 12.0 12.0
2016-12 12.0 12.0
2016-06 7.0
2016-08 7.0
2017-01 7.0
2016-09 8.0 8.0
2016-11 8.0 8.0
10.0
10.0
10.0
10.0
10.0
17.0
9.0
9.0
答案 0 :(得分:1)
我认为您的问题来自reset_index(),即将“Start Date”和“Start Date2”命名为数据列名称,而不是索引值。
尝试以下方法:
m1 = pd.DataFrame(m1).reset_index().rename(columns={'index':'Start Date','Start Date':'values'})
m2 = pd.DataFrame(m2).reset_index().rename(columns={'index':'Start Date2','Start Date2':'values2'})
m1.merge(m2,left_on= 'Start Date',right_on='Start Date2',how='outer')
那应该成功。
答案 1 :(得分:1)
merge
的语法是
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)
所以你可以做到
pd.merge(m1, m2, how='outer, left_index=True, right_index=True)
如果m1
和m2
是系列广告,您可能需要在pd.merge
中将其替换为m1.to_frame()
无需reset_index