Pandas создает столбец Foreign ID на основе столбца Name

68
10

У меня есть простой DataFrame, как это, например:

df = pd.DataFrame({'Name': ['John Doe', 'Jane Smith', 'John Doe', 'Jane Smith','Jack Dawson','John Doe']})
df:
Name
0 John Doe
1 Jane Smith
2 John Doe
3 Jane Smith
4 Jack Dawson
5 John Doe

Я хочу добавить столбец ['foreign_key'], который присваивает уникальный идентификатор каждому уникальному имени (но строки с тем же именем должны иметь одинаковую "foreign_key". Таким образом, конечный результат выглядит так:

df:
Name Foreign_Key
0 John Doe foreignkey1
1 Jane Smith foreignkey2
2 John Doe foreignkey1
3 Jane Smith foreignkey2
4 Jack Dawson foreignkey3
5 John Doe foreignkey1

Я пытаюсь использовать groupby с пользовательской функцией, которая применяется. Итак, мой первый шаг:

name_groupby = df.groupby('Name')

Так что расщепление, а затем - применение и объединение. В документах, подобных этому примеру, ничего не найдено, и я не уверен, куда идти отсюда.

Пользовательская функция, которую я начал применять, выглядит следующим образом:

def make_foreign_key(groupby_df):
return groupby_df['Foreign_Key'] = 'foreign_key' + num

Любая помощь очень ценится!

спросил(а) 2016-06-28T23:23:00+03:00 4 года назад
1
Решение
76

Ты можешь сделать:

pd.merge(
df,
pd.DataFrame(df.Name.unique(), columns=['Name']).reset_index().rename(columns={'index': 'Foreign_Key'}),
on='Name'
)

Name Foreign_Key
0 John Doe 0
1 John Doe 0
2 Jane Smith 1
3 Jane Smith 1

ответил(а) 2016-06-28T23:34:00+03:00 4 года назад
67

Я бы использовал groupb cumcount:

In [11]: df.groupby("Name").cumcount()
Out[11]:
0 0
1 0
2 1
3 1
4 0
5 2
dtype: int64

In [11]: df["Foreign_Key"] = df.groupby("Name").cumcount()

In [12]: df
Out[12]:
Name Foreign_Key
0 John Doe 0
1 Jane Smith 0
2 John Doe 1
3 Jane Smith 1
4 Jack Dawson 0
5 John Doe 2

Стоит отметить, что вы можете превратить Name в категорический с таким же эффектом:

In [21]: df["Name"].astype('category')
Out[21]:
0 John Doe
1 Jane Smith
2 John Doe
3 Jane Smith
4 Jack Dawson
5 John Doe
Name: Name, dtype: category
Categories (3, object): [Jack Dawson, Jane Smith, John Doe]

См. Категориальный раздел документов.

ответил(а) 2016-06-28T23:31:00+03:00 4 года назад
54

Я столкнулся с той же проблемой, и мое решение выглядело следующим образом:

import pandas as pd
import numpy as np
values = df['Name'].unique()
values = pd.Series(np.arange(len(values)), values)
df['new_column'] = df['Name'].apply(values.get)

Выход:

          Name  new_column
0 John Doe 0
1 Jane Smith 1
2 John Doe 0
3 Jane Smith 1
4 Jack Dawson 2
5 John Doe 0

ответил(а) 2017-06-04T00:57:00+03:00 3 года назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема