#python #python-3.x #pandas #dataframe
#python #python-3.x #pandas #фрейм данных
Вопрос:
Мой фрейм данных1:
id filler ent seg val text
1 M,0-10 CP BEC 20 abc
2 M,10-20 D BWC 30 abc
3 Y,0-10 CP CCD 40 abc
4 Y,10-20 D CFC 50 abc
фрейм2 данных:
id filler ent seg val text
1 M,0-10 CP BEC 20 xyz
2 Y,10-20 D CFC 50 xyz
необходимо создать
результирующий фрейм данных:
id filler ent seg val text
1 M,0-10 CP BEC 20 xyz
2 M,10-20 D BWC 30 abc
3 Y,0-10 CP CCD 40 abc
4 Y,10-20 D CFC 50 xyz
где его вид проверяет, имеют ли все столбцы, кроме текста, одинаковое значение, затем обновляет dataframe1 на dataframe 2. мой dataframe1 имеет 100 строк, а dataframe2 имеет 20 строк.
Ответ №1:
Вы можете выполнить левое слияние фрейма данных 2 с фреймом данных 1 и использовать столбец индикатора для поиска значений, которые необходимо обновить в фрейме данных 1.
columns = ['id','filler','ent','seg','val','text']
df1 = pd.DataFrame([
[1, 'M,0-10','CP','BEC',20, 'abc'],
[2,'M,10-20','D','BWC',30,'abc'],
[3,'Y,0-10','CP','CCD',40,'abc'],
[4,'Y,10-20','D','CFC',50,'abc'],
], columns=columns)
df2 = pd.DataFrame([
[1,'M,0-10','CP','BEC',20,'xyz'],
[4,'Y,10-20','D','CFC',50,'xyz'],
], columns=columns)
Объединить dataframe2 в dataframe1 со столбцом индикатора
columns_merge = [x for x in columns if x!='text']
updated = df1.merge(df2, on=columns_merge, how='left', indicator=True)
Сравните и установите содержимое, которое необходимо обновить, на основе столбца индикатора.
same = updated['_merge']=='both'
updated.loc[same,'text_x'] = updated.loc[same,'text_y']
Удаление и переименование столбцов
updated.drop(columns=['text_y','_merge'], inplace=True)
updated.rename(columns = {'text_x': 'text'}, inplace=True)
обновлено =
id filler ent seg val text
0 1 M,0-10 CP BEC 20 xyz
1 2 M,10-20 D BWC 30 abc
2 3 Y,0-10 CP CCD 40 abc
3 4 Y,10-20 D CFC 50 xyz
Комментарии:
1. ПРИВЕТ, Джейсон, спасибо за ответ, у меня есть только одна проблема, с которой я сталкиваюсь, я увеличиваю количество строк, например: мои данные имеют 112 строк в df1 и 24 строки в df2, но мой обновленный фрейм данных равен 120 строкам. Пожалуйста, помогите мне в этом
2. Попробуйте df2.drop_duplicates(subset=[‘id’,’filler’,’ent’,’seg’,’val’,’text’]) и проверьте результирующее количество строк. Это будет меньше 24 строк.
3. Из-за того, как здесь используется функция слияния (позиция df1, df2 и how=left ), результат слияния будет включать одну строку для каждой строки в df1, если в df2 не было дубликатов. В вашем случае в df1 есть записи, которые соответствуют нескольким записям в df2, и результирующее слияние включает эти дублированные записи.