Заменить значения ячеек в Pandas с помощью идентификатора соответствия из другого фрейма данных

У меня есть dataframe, который содержит список доменов (или вершин / узлов в моем случае), которые я храню через библиотеку pandas:

domain 0 airbnb.com 1 facebook.com 2 st.org 3 index.co 4 crunchbase.com 5 avc.com 6 techcrunch.com 7 google.com 

У меня есть другой фрейм данных, который содержит соединения между этими доменами (aka edge):

  source_domain destination_domain 0 airbnb.com google.com 1 facebook.com google.com 2 st.org facebook.com 3 st.org airbnb.com 4 st.org crunchbase.com 5 index.co techcrunch.com 6 crunchbase.com techcrunch.com 7 crunchbase.com airbnb.com 8 avc.com techcrunch.com 9 techcrunch.com st.org 10 techcrunch.com google.com 11 techcrunch.com facebook.com 

так как этот набор данных будет намного больше, я прочитал, что я могу иметь более высокую производительность, если я представляю «ребра» для данных только целыми числами вместо строк.

Итак, мне интересно, есть ли быстрый способ заменить каждую ячейку в реберном фрейме с соответствующим идентификатором из домена (aka vertices) dataframe? Таким образом, строка 1 в ребрах данных может выглядеть так:

 ###### Before: ##################### 1 facebook.com google.com ###### After: ##################### 1 1 7 

Как я могу это сделать? Заранее спасибо.

3 Solutions collect form web for “Заменить значения ячеек в Pandas с помощью идентификатора соответствия из другого фрейма данных”

Я пытаюсь реализовать другой ответ – конвертировать в Catagorical и для ints использовать cat.codes :

 #if always unique domain in df1 can be omit #cats = df1['domain'].unique() cats = df1['domain'] df2['source_domain'] = df2['source_domain'].astype('category', categories=cats) df2['destination_domain'] = df2['destination_domain'].astype('category', categories=cats) df2['source_code'] = df2['source_domain'].cat.codes df2['dest_code'] = df2['destination_domain'].cat.codes print (df2) source_domain destination_domain source_code dest_code 0 airbnb.com google.com 0 7 1 facebook.com google.com 1 7 2 st.org facebook.com 2 1 3 st.org airbnb.com 2 0 4 st.org crunchbase.com 2 4 5 index.co techcrunch.com 3 6 6 crunchbase.com techcrunch.com 4 6 7 crunchbase.com airbnb.com 4 0 8 avc.com techcrunch.com 5 6 9 techcrunch.com st.org 6 2 10 techcrunch.com google.com 6 7 11 techcrunch.com facebook.com 6 1 

 df2['source_domain'] = df2['source_domain'].astype('category', categories=cats).cat.codes df2['destination_domain'] = df2['destination_domain'].astype('category', categories=cats) .cat.codes print (df2) source_domain destination_domain 0 0 7 1 1 7 2 2 1 3 2 0 4 2 4 5 3 6 6 4 6 7 4 0 8 5 6 9 6 2 10 6 7 11 6 1 

Если хотите заменить на map использования dict :

 d = dict(zip(df1.domain.values, df1.index.values)) df2['source_code'] = df2['source_domain'].map(d) df2['dest_code'] = df2['destination_domain'].map(d) print (df2) source_domain destination_domain source_code dest_code 0 airbnb.com google.com 0 7 1 facebook.com google.com 1 7 2 st.org facebook.com 2 1 3 st.org airbnb.com 2 0 4 st.org crunchbase.com 2 4 5 index.co techcrunch.com 3 6 6 crunchbase.com techcrunch.com 4 6 7 crunchbase.com airbnb.com 4 0 8 avc.com techcrunch.com 5 6 9 techcrunch.com st.org 6 2 10 techcrunch.com google.com 6 7 11 techcrunch.com facebook.com 6 1 

Это полезно для категориальных данных: http://pandas.pydata.org/pandas-docs/stable/categorical.html

Короче говоря, категориальная серия будет внутренне представлять каждый элемент в виде числа, но отображать его как строку. Это полезно, когда у вас много повторяющихся строк.

Легче и менее подвержено ошибкам использовать категориальную серию и конвертировать все в целые числа вручную.

Самый простой способ сделать это – создать словарь из вершинного фрейма данных … ЕСЛИ мы можем быть уверены, что он представляет собой окончательный набор вершин, который будет отображаться по краям … и использовать его с replace

Поскольку индекс вершинного кадра данных уже имеет информацию о факторе …

 m = dict(zip(vertices.domain, vertices.index)) edges.replace(m) source_domain destination_domain 0 0 7 1 1 7 2 2 1 3 2 0 4 2 4 5 3 6 6 4 6 7 4 0 8 5 6 9 6 2 10 6 7 11 6 1 

Вы также можете использовать stack / map / unstack

 m = dict(zip(vertices.domain, vertices.index)) edges.stack().map(m).unstack() source_domain destination_domain 0 0 7 1 1 7 2 2 1 3 2 0 4 2 4 5 3 6 6 4 6 7 4 0 8 5 6 9 6 2 10 6 7 11 6 1 

редакционный

Я хотел прокомментировать ответ @ JohnZwinck в дополнение к предоставлению моей информации.

Во-первых, categorical обеспечит более высокую производительность. Тем не менее, я не знаю, как обеспечить наличие двух столбцов скоординированных категорий. Под координированным я подразумеваю, что каждый столбец получает целые числа, назначенные каждой категории за кулисами. У нас есть способ узнать или применить (не то, что я знаю), что эти целые числа одинаковы. Если бы мы сделали его одним большим столбцом, то преобразовали бы этот столбец в категориальный, который бы работал … Однако я считаю, что он вернется к объекту, когда мы снова разделимся на два столбца.

  • Условное замещение значений в столбцах dataframe pandas
  • Логарифмическая доходность в рамке данных pandas
  • Pandas: зачем нужны двойные скобки для выбора столбца после булевской индексации?
  • Группировка индекса даты в пандах
  • Может ли Pandas работать в Google App Engine для Python?
  • Почему я получаю только один параметр из набора statsmodels OLS
  • Более эффективный способ очистки столбца строк и добавления нового столбца
  • ANOVA в python с использованием рамки данных pandas с statsmodels или scipy?
  • Отображение Pandas Dataframe на веб-странице
  • Construct pandas DataFrame из элементов вложенного словаря
  • группировка строк в списке в pandas groupby
  • Python - лучший язык программирования в мире.