Існують також стратегії, які ви можете використовувати, щоб уникнути такої поведінки, яка не передбачає втрати дубльованих даних, якщо, наприклад, не всі стовпці дублюються. Якщо у вас є
In [1]: df = pd.DataFrame([[1, 3], [2, 4]], columns=['A', 'B'])
In [2]: df2 = pd.DataFrame([[1, 5], [1, 6]], columns=['A', 'C'])
Одним із способів було б взяти середнє значення дубліката (також можна взяти суму тощо ...)
In [3]: df3 = df2.groupby('A').mean().reset_index()
In [4]: df3
Out[4]:
C
A
1 5.5
In [5]: merged = pd.merge(df,df3,on=['A'], how='outer')
In [6]: merged
Out[204]:
A B C
0 1 3 5.5
1 2 4 NaN
Крім того, якщо у вас є нечислові дані, які неможливо перетворити за допомогою pd.to_numeric (), або якщо ви просто не хочете брати середнє, ви можете змінити змінну злиття, перерахувавши дублікати. Однак ця стратегія застосовуватиметься, коли дублікати існують в обох наборах даних (що може спричинити однакову проблемну поведінку, а також є загальною проблемою):
In [7]: df = pd.DataFrame([['a', 3], ['b', 4],['b',0]], columns=['A', 'B'])
In [8]: df2 = pd.DataFrame([['a', 3], ['b', 8],['b',5]], columns=['A', 'C'])
In [9]: df['count'] = df.groupby('A')['B'].cumcount()
In [10]: df['A'] = np.where(df['count']>0,df['A']+df['count'].astype(str),df['A'].astype(str))
In[11]: df
Out[11]:
A B count
0 a 3 0
1 b 4 0
2 b1 0 1
Зробіть те ж саме для df2, опустіть змінні підрахунку в df і df2 і об'єднайте в 'A':
In [16]: merged
Out[16]:
A B C
0 a 3 3
1 b 4 8
2 b1 0 5
Пара приміток. У цьому останньому випадку я використовую .cumcount () замість .duplicated, оскільки може бути так, що у вас є більше одного дубліката для даного спостереження. Крім того, я використовую .astype (str) для перетворення значень підрахунку в рядки, оскільки я використовую команду np.where (), але використання pd.concat () або щось інше може дозволити різні програми.
Нарешті, якщо випадок є, що лише в одному наборі даних є дублікати, але ви все одно хочете зберегти їх, тоді ви можете використовувати першу половину останньої стратегії, щоб диференціювати дублікати в результаті злиття.