Обновление и объединение столбца в панде

У меня есть столбец "А" в двух фреймах данных, скажем, df1 и df2.

df1:

|  ID  | A |  |
|------|---|--|
| ID1  | 5 |  |
| ID2  | 6 |  |
| ID3  | 7 |  |
| ID4  | 8 |  |

df2:

|  ID  | A |  |
|------|---|--|
| ID1  | 5 |  |
| ID2  | 1 |  |
| ID3  | 8 |  |
| ID5  | 7 |  |
| ID6  | 8 |  |
| ID7  | 9 |  |

Требуется обновление df1:

|  ID  | A |  |
|------|---|--|
| ID1  | 5 |  |
| ID2  | 1 |  |
| ID3  | 8 |  |
| ID4  | 8 |  |
| ID5  | 7 |  |
| ID6  | 8 |  |
| ID7  | 9 |  |

Я хочу обновить столбец "A" в df1 значениями из df2, если идентификатор находится в df2, иначе я хочу сохранить то же значение в df1. Более того, если в df2 появятся новые идентификаторы, я хочу добавить новые значения в df1.

Я видел документацию по pd.DataFrame.update, в которой он обновляет значения из df2 в df1, но не добавляет новые значения в df1. Любая помощь будет оценена. Заранее спасибо.

1 ответ

Решение

Я считаю нужно:

df = pd.concat([df1, df2]).drop_duplicates(subset=['ID'], keep='last').sort_values('ID')
print (df)
    ID  A
0  ID1  5
1  ID2  1
2  ID3  8
3  ID4  8
3  ID5  7
4  ID6  8
5  ID7  9

Пояснение:

Первый concat и то и другое DataFrame все вместе:

print (pd.concat([df1, df2]))
    ID  A
0  ID1  5
1  ID2  6
2  ID3  7
3  ID4  8
0  ID1  5
1  ID2  1
2  ID3  8
3  ID5  7
4  ID6  8
5  ID7  9

Потому что же ID создавать, удалять дубликаты с помощью drop_duplicates с сохранением только последнего значения:

print (pd.concat([df1, df2]).drop_duplicates(subset=['ID'], keep='last'))
    ID  A
3  ID4  8
0  ID1  5
1  ID2  1
2  ID3  8
3  ID5  7
4  ID6  8
5  ID7  9

И последний сортировать по ID от sort_values,

Вы можете сделать то же самое, используя метод слияния Pandas.

Вы можете объединить df1 и df2, используя функцию слияния следующим образом:

df = pd.merge(df2,df1, how ='outer')

Здесь я объединяю df2 с df1. external использует объединение ключей из обоих фреймов данных. Union возьмет все ключи из df2 и только те ключи из df1, которых нет в df2.

Второй шаг - удалить повторяющиеся строки с учетом столбца идентификатора.

df = df.drop_duplicates(subset=['ID'],keep='first')

Это приведет к удалению всех повторяющихся строк в столбце ID, кроме первого вхождения.

Третий шаг - отсортировать строки с учетом столбца идентификатора.

df =df.sort_values('ID')

Другие вопросы по тегам