Pandas根据名称列

时间:2016-06-28 20:23:25

标签: python pandas dataframe foreign-keys

我有一个这样的简单数据框,例如:

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

非常感谢任何帮助!

3 个答案:

答案 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