即使在带有`left`选项的`pandas.merge`之后,行数也会发生变化

时间:2016-05-08 00:59:35

标签: python pandas

我使用pandas.merge合并两个数据框。即使在指定how = left选项后,我发现合并数据帧的行数大于原始行。为什么会这样?

panel = pd.read_csv(file1, encoding ='cp932')
before_len = len(panel)

prof_2000 = pd.read_csv(file2, encoding ='cp932').drop_duplicates()

temp_2000 = pd.merge(panel, prof_2000, left_on='Candidate_u', right_on="name2", how="left")

after_len =  len(temp_2000)
print(before_len, after_len)
> 12661 13915

2 个答案:

答案 0 :(得分:15)

这听起来好像right'name2'下的多行与您为left设置的键匹配。将选项'how='left'pandas.DataFrame.merge()一起使用仅表示:

  
      
  • 左:仅使用左框架中的键
  •   

但是,结果对象中的实际行数不一定与left对象中的行数相同。

示例:

In [359]: df_1
Out[359]: 
   A    B
0  a  AAA
1  b  BBA
2  c  CCF

然后是另一个看起来像这样的DF(注意左边所需的键有多个条目):

In [360]: df_3
Out[360]: 
  key  value
0   a      1
1   a      2
2   b      3
3   a      4

如果我在left.A上合并这两个,那么会发生以下情况:

In [361]: df_1.merge(df_3, how='left', left_on='A', right_on='key')
Out[361]: 
   A    B  key  value
0  a  AAA    a    1.0
1  a  AAA    a    2.0
2  a  AAA    a    4.0
3  b  BBA    b    3.0
4  c  CCF  NaN    NaN

即使我与上面的how='left'合并,也发生了这种情况,只有多行要合并,如图所示,结果pd.DataFrame实际上比{pd.DataFrame更多行1 {} left

我希望这有帮助!

答案 1 :(得分:0)

每个merge()(任何类型,“都是”或“左边”)之后的行数加倍的问题通常是由任何键重复造成的,因此我们需要先删除它们:

left_df.drop_duplicates(subset=left_key, inplace=True)
right_df.drop_duplicates(subset=right_key, inplace=True)