Как объединить соответствующие индексы с двумя кадрами данных pandas

#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 этим и даже не знал, что это доступно. Спасибо за это.