合并pandas中的2个数据帧会导致重复值

时间:2017-04-28 10:01:01

标签: python pandas dataframe

我有两个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

2 个答案:

答案 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)

如果m1m2是系列广告,您可能需要在pd.merge中将其替换为m1.to_frame()

无需reset_index