我使用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
答案 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)