将两个熊猫数据框放在一起

时间:2019-08-06 10:59:10

标签: python pandas

这是两个数据框:

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

编辑

实际上,当我尝试在原始数据帧上进行合并时,出现以下错误:

  

数据列不是唯一的:索引[(...)]

2 个答案:

答案 0 :(得分:1)

DatFramesGroupBy.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()