我有一个这样的简单数据框,例如:
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'],为每个唯一名称分配一个唯一的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
我正在尝试将groupby与已应用的自定义函数一起使用。 所以我的第一步是:
name_groupby = df.groupby('Name')
这就是分裂,然后是应用和组合。在这个例子的文档中似乎没有任何内容,我不确定从这里开始。
我开始应用的自定义功能如下所示:
def make_foreign_key(groupby_df):
return groupby_df['Foreign_Key'] = 'foreign_key' + num
非常感谢任何帮助!
答案 0 :(得分:3)
您可以将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]
请参阅categorical section of the docs。
这可能就足够了,或者你可以将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
答案 1 :(得分:3)
你可以这样做:
def count_code(str):
count = 0 #set count to 0 initially
#For loops number of times that there are chars
for i in range(len(str)-1):
#looks for "co", [any char] and "e"
if str[i:i+2] == "co" and str[i+3:i+4] == "e":
#add up the number of times this happens and return it
count+= 1
return count
答案 2 :(得分:1)
我很久以前遇到了同样的问题,我的解决方案如下:
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