如何合并在公共列中具有重复值的两个数据框

时间:2020-11-05 12:15:14

标签: python python-3.x pandas dataframe

我在一个数据框的公共列中有重复的值,必须与另一个合并。 如何在不重复且不添加其他数据帧中的列的情况下将它们都加入?


df_1:

dataframe 1


df_2:

dataframe 2

如何将这两个数据帧合并到一个没有重复列的数据帧中,因为两个数据帧中的列列表相同?

预期的最终数据帧:

enter image description here

2 个答案:

答案 0 :(得分:0)

创建第一个数据框:

import pandas as pd
df_1 = pd.DataFrame({'Value_1': [25, 22, None, None, 10, 15],
                    'Value_2': [34, 18, None, None, 0,  12],
                    'Value_3': [58, 65, None, None, 18, 32]}
                    , index = ['A1', 'B1', 'C1', 'C1', 'C2', 'D1'])
print(df_1)

输出:

    Value_1  Value_2  Value_3
A1     25.0     34.0     58.0
B1     22.0     18.0     65.0
C1      NaN      NaN      NaN
C1      NaN      NaN      NaN
C2     10.0      0.0     18.0
D1     15.0     12.0     32.0

创建第二个数据框:

df_2 = pd.DataFrame({'Value_1': [15, 45],
                    'Value_2': [22, 198],
                    'Value_3': [36, 265]}
                    , index = ['C1', 'C1'])
print(df_2)

输出:

    Value_1  Value_2  Value_3
C1       15       22       36
C1       45      198      265
        

您可以将df_1与df_2中的新行连接。然后使用df_2中的值更新值。

df = pd.concat([df_1[~df_1.index.isin(df_2.index)], df_2])
print(df)

输出:

    Value_1  Value_2  Value_3
A1     25.0     34.0     58.0
B1     22.0     18.0     65.0
C2     10.0      0.0     18.0
D1     15.0     12.0     32.0
C1     15.0     22.0     36.0
C1     45.0    198.0    265.0

答案 1 :(得分:0)

pandas.merge将创建额外的列,因为它只是一个连接函数。您可以根据需要使用[combine_first][1]用df_2更新df_1。这将与您的索引匹配,并替换其他数据框中的空值。

df_1

    Id  Value_1 Value_2 Value_3
0   A1  25.0    34.0    58.0
1   B1  22.0    18.0    65.0
2   C1  NaN     NaN     NaN
3   C1  NaN     NaN     NaN
4   C2  10.0    0.0     18.0
5   D1  15.0    12.0    32.0
df_2

    Id  Value_1 Value_2 Value_3
0   C1  15      22      36
1   C1  45     198      265
Updated_df = (df_1.set_index('Id').combine_first(df_2.set_index('Id')).reset_index().reindex(columns=df_1.columns)).drop_duplicates()
Updated_df

    Id  Value_1 Value_2 Value_3
0   A1  25.0    34.0    58.0
1   B1  22.0    18.0    65.0
2   C1  15.0    22.0    36.0
3   C1  45.0    198.0   265.0
6   C2  10.0    0.0     18.0
7   D1  15.0    12.0    32.0