Обновление и объединение столбца в панде
У меня есть столбец "А" в двух фреймах данных, скажем, 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')