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

use*_*966 12 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
Run Code Online (Sandbox Code Playgroud)

Tha*_*nos 16

这听起来像有一个以上的行right'name2'匹配您已经设置了该密钥left.使用选项'how='left'pandas.DataFrame.merge()仅仅意味着:

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

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

例:

In [359]: df_1
Out[359]: 
   A    B
0  a  AAA
1  b  BBA
2  c  CCF
Run Code Online (Sandbox Code Playgroud)

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

In [360]: df_3
Out[360]: 
  key  value
0   a      1
1   a      2
2   b      3
3   a      4
Run Code Online (Sandbox Code Playgroud)

如果我合并这两个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
Run Code Online (Sandbox Code Playgroud)

这甚至发生了,虽然我与合并how='left',你可以在上面看到,有简单的一个以上的行合并,如下图所示的结果pd.DataFrame实际上已经比更多的行pd.DataFrameleft.

我希望这有帮助!

  • 你的答案很完美!谢谢!就我而言, `.drop_duplicates(subset="name2")` 会删除重复的行,这对于我的目的来说很好! (3认同)

mir*_*phd 8

每个(任何类型,“两者”或“左”)之后的行加倍的问题merge()通常是由任何键中的重复项引起的,因此我们需要首先删除它们:

left_df.drop_duplicates(subset=left_key, inplace=True)
right_df.drop_duplicates(subset=right_key, inplace=True)
Run Code Online (Sandbox Code Playgroud)