Обновление определенных значений столбца из другого фрейма данных на основе условия нескольких столбцов

#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, и результирующее слияние включает эти дублированные записи.