#python #pandas #dataframe #merge
#python #pandas #фрейм данных #слияние
Вопрос:
У меня возникли проблемы с объединением двух фреймов данных в pandas. Они являются частями набора данных, разделенного между двумя файлами, и они разделяют некоторые столбцы и значения, а именно «имя» и «адрес». Записи с одинаковыми значениями не разделяют свой индекс с записями в другом файле. Я пробовал варианты следующей строки:
res = pd.merge(df, df_p, on=['name', 'address'], how="left")
Когда для аргумента how было установлено значение ‘left’, столбцы из df_p не имели значений. ‘right’ имел противоположный эффект: столбцы из df были пустыми. ‘inner’ привел к пустому фрейму данных, а ‘outer’ дублировал количество записей, по сути, просто добавляя результаты ‘left’ и ‘right’.
Я вручную проверил, что в обоих файлах присутствуют одинаковые комбинации значений ‘name’ и ‘address’.
Редактировать: попытка объединения в одном из этих столбцов кажется успешной, однако я хочу избежать слияния неправильных записей в случае, если 2 человека с одинаковыми именами имеют разные адреса и наоборот
Edit1: Вот еще немного информации о наборе данных.
df.info () вывод:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3983 entries, 0 to 3982
Data columns (total 23 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Unnamed: 0 3983 non-null int64
1 name 3983 non-null object
2 address 3983 non-null object
3 race 3970 non-null object
4 marital-status 3967 non-null object
5 occupation 3971 non-null object
6 pregnant 3969 non-null object
7 education-num 3965 non-null float64
8 relationship 3968 non-null object
9 skewness_glucose 3972 non-null float64
10 mean_glucose 3572 non-null float64
11 capital-gain 3972 non-null float64
12 kurtosis_glucose 3970 non-null float64
13 education 3968 non-null object
14 fnlwgt 3968 non-null float64
15 class 3969 non-null float64
16 std_glucose 3965 non-null float64
17 income 3974 non-null object
18 medical_info 3968 non-null object
19 native-country 3711 non-null object
20 hours-per-week 3971 non-null float64
21 capital-loss 3969 non-null float64
22 workclass 3968 non-null object
dtypes: float64(10), int64(1), object(12)
memory usage: 715.8 KB
пример записи из df:
0,Curtis Brown,"32266 Byrd Island
Fowlertown, DC 84201", White, Married-civ-spouse, Exec-managerial,f,9.0, Husband,1.904881822,79.484375,15024.0,0.667177618, HS-grad,147707.0,0.0,39.49544760000001, >50K,"{'mean_oxygen':'1.501672241','std_oxygen':'13.33605383','kurtosis_oxygen':'11.36579476','skewness_oxygen':'156.77910559999995'}", United-States,60.0,0.0, Private
df_p.info () вывод:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3933 entries, 0 to 3932
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Unnamed: 0 3933 non-null int64
1 name 3933 non-null object
2 address 3933 non-null object
3 age 3933 non-null int64
4 sex 3933 non-null object
5 date_of_birth 3933 non-null object
dtypes: int64(2), object(4)
memory usage: 184.5 KB
пример записи из df_p:
2273,Curtis Brown,"32266 Byrd Island
Fowlertown, DC 84201",44, Male,1975-03-26
Как вы можете видеть, выбранные образцы предназначены для одного и того же человека, но их индекс не совпадает, поэтому я попытался использовать столбцы name и address .
Edit2: изменение порядка df и df_p при слиянии, похоже, решило проблему, хотя я понятия не имею, почему.
Комментарии:
1. Было бы неплохо, если бы вы могли поделиться образцом
df
иdf_p
в вопросе в текстовой форме.2. вы можете использовать drop_duplicates после слияния с outer