Как объединить два фрейма данных, которые имеют повторяющиеся значения в общем столбце

#python #python-3.x #pandas #dataframe

#python #python-3.x #pandas #фрейм данных

Вопрос:

У меня есть повторяющиеся значения в общем столбце фрейма данных, который необходимо объединить с другим. Как я могу объединить их оба без дублирования и без добавления столбцов из другого фрейма данных?

df_1:

фрейм данных 1

df_2:

фрейм данных 2

Как я могу объединить эти 2 фрейма данных в один фрейм данных без повторяющихся столбцов, поскольку список столбцов в обоих фреймах данных одинаковый?

Ожидаемый конечный фрейм данных:

введите описание изображения здесь

Ответ №1:

Создание первого фрейма данных:

 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
  

Ответ №2:

pandas.merge создаст дополнительные столбцы, поскольку это просто функция объединения. Вы можете попробовать обновить df_1 с помощью df_2, используя [combine_first][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