Панды - pd.merge, добавить проверку, чтобы убедиться, что столбец не существует? - PullRequest
0 голосов
/ 05 июня 2018

У меня есть два фрейма данных: один основной, с которым я работаю, и вспомогательный, с которого я хочу получить информацию.

df1 (main) содержит столбец Reporter с различными строками имен.

df2 (дополнительная информация) содержит имя репортера и его местоположение.

Я хочу добавить столбец местоположения в качестве нового столбца в df1.

Я могу сделатьследующее как единое целое с:

df1 = pd.merge(df1, df2, on='Reporter', how='left')

и это работает.

Моя проблема в том, что я запускаю часто обновляемый скрипт (проверка на новые строки и проверка наобновляет старые строки), и выполнение этой строки кода многократно добавляет несколько столбцов для каждого выполнения.

  • Проблема с простой проверкой существования столбца состоит в том, что новая строка (которая содержит новуюимя репортера), возможно, было добавлено к df, который я действительно хочу знать / обновить местоположение.

  • Правильно ли я поступаю?Или я должен сделать какой-то поиск в стиле dict и каждый раз условно отображать местоположение?Как я могу сделать это в пандах?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Спасибо за информацию о скорости охлаждения, но я выбрал второй вариант, сопоставив dict.

reporter_dict = dict(zip(df2['Reporter'].astype(str),df2['Reporter Location']))
df['Reporter Location'] = df['Reporter'].astype(str).map(reporter_dict)
0 голосов
/ 05 июня 2018

Для одной серии я часто предпочитаю отображать серии, а не merge или join (обе также допустимые опции, если они используются правильно).

Примечание. Предполагается, что вы уже применили str преобразование во все столбцы в зависимости от ситуации.

s = df2.set_index('Reporter')['Reporter Location']

df['Reporter Location'] = df['Reporter'].map(s)

Как правило, нет необходимости преобразовывать ваши серии в dict или использовать zip на pd.Series объектах.Использование zip с numpy массивами может быть неэффективным .

0 голосов
/ 05 июня 2018

Проблема с pd.merge в том, что он всегда добавляет суффиксы к результату.

Не используйте его.

Используйте эквивалент DataFrame.join или DataFrame.merge на том, на котором вы выполняете левое соединение.

df1 = df1.join(df2, on='Reporter', how='left')

Или,

df1 = df1.merge(df2, on='Reporter', how='left')

Общий столбец сохраняется только один раз в результате.Другие, идентичные столбцы между ними (если они есть) дублируются (с суффиксами), однако.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...