#python #pandas
Вопрос:
Хотя это казалось чем-то, о чем спрашивали раньше, я не нашел никакой информации о лучших методах выполнения этой функции.
Обзор: У меня есть два кадра данных; первый-это то, что я бы назвал ПОЛНЫМ кадром данных. Это, так сказать, первоисточник. Затем у меня есть кадр данных, который включает в себя части исходного набора данных, но с некоторой новой или обновленной информацией.
Цель: Я хочу иметь возможность взять новый набор данных и применить его результаты к исходному кадру данных; наложение его значений на строки/столбцы исходного набора данных.
Проблема: В настоящее время моя проблема заключается в том, что я еще не нашел правильный формат, используемый merge
для получения результата, который я ищу. Я либо получаю только те строки, которые совпадают с двумя кадрами данных, либо просто возвращаю исходный набор без добавления к нему новой информации.
geoid = pandas.DataFrame({'Address': ['4050 Blake Ct', '1234 w east st'],
'ID': ['789456', '654321'],
'State': ['NV', 'NV'],
'Zip': ['88991', '88991'],
'Ph': ['789456', '456132']})
print(geoid)
Address ID State Zip Ph
0 4050 Blake Ct 789456 NV 88991 789456
1 1234 w east st 654321 NV 88991 456132
original = pandas.DataFrame({'Address': ['', '1234 w east st', 'PO box 789'],
'ID': ['789456', '654321', '654789'],
'State': ['NV', 'CA', 'CA'],
'Zip': ['88991', '88991', '99663'],
'Ph': ['789456', '456132', '741852']})
print(original)
Address ID State Zip Ph
0 789456 NV 88991 789456
1 1234 w east st 654321 NV 88991 456132
2 PO box 789 654789 CA 99663 741852
# This produces the same as the original dataframe, with no changes
df = original.merge(geoid, how='left', on=list(original.columns))
# This keeps only the rows from the geoid dataframe
df = original.merge(geoid, how='right', on=list(original.columns))
# This duplicates the data so that it includes data from both dataframes
df = original.merge(geoid, how='outer', on=list(original.columns))
# This produces an empty dataframe
df = original.merge(geoid, how='inner', on=list(original.columns))
Это тот результат, который я ищу:
При значении индекса 0 в 4050 Blake Ct
фрейме данных геоида значение существует, тогда как в исходном фрейме данных оно пустое. Я хочу, чтобы это значение было скопировано в исходный кадр данных, перезаписав то, что когда-то было там.
**Примечание: пустая ячейка в исходном кадре данных является примером того, что там может быть, но не ограничивается пустыми ячейками. В идеале я хочу иметь возможность «накладывать» свой геоидный фрейм данных поверх исходного фрейма данных. Индекс для каждого кадра данных всегда будет совпадать с записями. Думайте о фрейме данных геоида как о отсортированной или обрезанной версии исходного фрейма данных.
Address ID State Zip Ph
0 4050 Blake Ct 789456 NV 88991 789456
1 1234 w east st 654321 NV 88991 456132
2 PO box 789 654789 CA 99663 741852
Существует множество способов, которыми это можно сделать за пределами функции панд, но я чувствую, что должен быть способ сделать это, встроенный в панд, но, возможно, я ошибаюсь.
Ответ №1:
Вы можете использовать этот pandas.DataFrame.update
метод.
geoid = geoid.set_index('ID')
original = original.set_index('ID')
original.update(geoid)
Ответ №2:
Вы можете использовать Dataframe.update()
original.update(geoid,join='left')
выход:
Address ID State Zip Ph
0 4050 Blake Ct 789456 NV 88991 789456
1 1234 w east st 654321 NV 88991 456132
2 PO box 789 654789 CA 99663 741852
Комментарии:
1. Я был незнаком с
update
этим и даже не знал, что это доступно. Спасибо за это.