Pandas 根据名称列创建外国 ID 列

unp*_*ood 4 python foreign-keys dataframe pandas

我有一个像这样的简单数据框:

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
Run Code Online (Sandbox Code Playgroud)

我想添加一列 ['foreign_key'] 为每个唯一名称分配一个唯一 ID(但具有相同名称的行应该具有相同的 '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
Run Code Online (Sandbox Code Playgroud)

我正在尝试将groupby与应用的自定义函数一起使用。所以我的第一步是:

name_groupby = df.groupby('Name')
Run Code Online (Sandbox Code Playgroud)

这就是拆分,接下来是应用和组合。文档中似乎没有像这个例子这样的任何内容,我不确定从这里去哪里。

我开始应用的自定义函数如下所示:

def make_foreign_key(groupby_df):
    return groupby_df['Foreign_Key'] = 'foreign_key' + num
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

And*_*den 5

您可以将 Name 设为 Categorical,效果大致相同:

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]
Run Code Online (Sandbox Code Playgroud)

请参阅文档的分类部分

这可能就足够了,或者您可以将其作为外键取出codes

In [22]: df["Name"] = df["Name"].astype('category')

In [23]: df["Name"].cat.codes
Out[23]:
0    2
1    1
2    2
3    1
4    0
5    2
dtype: int8

In [24]: df["Foreign_Key"] = c.cat.codes

In [25]: df
Out[25]:
          Name  Foreign_Key
0     John Doe            2
1   Jane Smith            1
2     John Doe            2
3   Jane Smith            1
4  Jack Dawson            0
5     John Doe            2
Run Code Online (Sandbox Code Playgroud)