这是两个数据框:
df1 = pd.DataFrame({'col1': ['v0', 'v1', 'v0'], 'col2': ['v0', 'v1', 'v0'], 'col3': [10, 11, 12]})
df2 = pd.DataFrame({'col1': ['v0', 'v1', 'v2', 'v0'], 'col2': ['v0', 'v1', 'v2', 'v0']})
您会发现每列中的值不是唯一的。
我想将它们合并在一起,但是merge
似乎并没有实现我想要实现的目标:
df2.merge(df1, how='left')
将返回:
col1 col2 col3
0 v0 v0 10.0
1 v0 v0 12.0
2 v1 v1 11.0
3 v2 v2 NaN
4 v0 v0 10.0
5 v0 v0 12.0
我不希望他们重复。我知道我可以删除重复项,但是在我原来的情况下,它似乎也没有做任何工作。
我也尝试过join
,但结果如下:
df2.join(df1, lsuffix='_caller', rsuffix='_other')
您可以看到最后一行_caller
中的'v0'与_other
中的'v0'不匹配,而是'v2'与'v0'对应:
col1_caller col2_caller col1_other col2_other col3
0 v0 v0 v0 v0 10.0
1 v1 v1 v1 v1 11.0
2 v2 v2 v0 v0 12.0
3 v0 v0 NaN NaN NaN
所以我一直在徘徊,有没有办法将它们合并在一起并获得以下结果:
col1 col2 col3
0 v0 v0 10.0
1 v1 v1 11.0
2 v2 v2 NaN
3 v0 v0 12.0
编辑
实际上,当我尝试在原始数据帧上进行合并时,出现以下错误:
数据列不是唯一的:索引[(...)]
答案 0 :(得分:1)
在DatFrames
与GroupBy.cumcount
和左连接中将merge
用于计数器列:
df1['g'] = df1.groupby(['col1','col2']).cumcount()
df2['g'] = df2.groupby(['col1','col2']).cumcount()
df = df2.merge(df1, on=['col1','col2', 'g'], how='left').drop('g', axis=1)
print (df)
col1 col2 col3
0 v0 v0 10.0
1 v1 v1 11.0
2 v2 v2 NaN
3 v0 v0 12.0
答案 1 :(得分:1)
外部不会合并吗?
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="input-field col s12 clear password-button">
<input name="old_password" ng-model="form.password" id="old_password" type="password" class="validate">
<a class="showPassword"><i class="material-icons">visibility</i></a>
</div>
<div class="input-field col s12 clear password-button">
<input name="new_password1" ng-model="form.password1" id="new_password" type="password" class="validate">
<a class="showPassword"><i class="material-icons">visibility</i></a>
</div>
pd.merge(df1, df2, how='outer').drop_duplicates()