我有两个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: int64m1 =
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我尝试了多个版本(它们是系列的,所以我首先将它们转换为dataframes ):
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发布于 2017-04-28 12:08:36
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-call中用m1.to_frame()替换它们。
不需要reset_index
发布于 2017-04-28 11:29:27
我认为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')那应该就行了。
https://stackoverflow.com/questions/43677434
复制相似问题