2016-09-22 414 views
1

我有一个数据帧,看起来是这样的:如何通过引用其他两列在Python Dataframe中创建一个新列?

df = pd.DataFrame({'Name':['a','a','a','a','b','b','b'], 'Year':[1999,1999,1999,2000,1999,2000,2000], 'Name_id':[1,1,1,1,2,2,2]}) 

    Name Name_id Year 
0 a  1 1999 
1 a  1 1999 
2 a  1 1999 
3 a  1 2000 
4 b  2 1999 
5 b  2 2000 
6 b  2 2000 

我想有一个新列“yr_name_id”,对于每个唯一名_ID年增加了组合,然后用每一个新名_ID重新开始。

Name Name_id Year yr_name_id 
0 a  1 1999   1 
1 a  1 1999   1 
2 a  1 1999   1 
3 a  1 2000   2 
4 b  2 1999   1 
5 b  2 2000   2 
6 b  2 2000   2 

我已经尝试了各种东西,看起来herehere和上进行分组的几个帖子和枚举。

一开始我尝试结合名_ID和年份,然后用地图来分配值后,创造一个独特的字典,但是当我试图通过对名_ID和年合并为字符串:

df['yr_name_id'] = str(df['Name_id']) + str(df['Year']) 

新列有一个我不太明白的0 0 1\n1 1\n2 1\n3 1\n4 2\n5 2...的非唯一语法。

一个更有希望的办法,我想我只是需要与拉姆达帮助是使用GROUPBY

df['yr_name_id'] = df.groupby(['Name_id', 'Year'])['Name_id'].transform(lambda x:)#unsure from this point 

我非常熟悉的λ的等我怎么可能做到这一点的任何指导,将不胜感激。

回答

1

IIUC你能做到这样:

In [99]: df['yr_name_id'] = pd.Categorical(pd.factorize(df['Name_id'].astype(str) + '-' + df['Year'].astype(str))[0] + 1) 

In [100]: df 
Out[100]: 
    Name Name_id Year yr_name_id 
0 a  1 1999   1 
1 a  1 1999   1 
2 a  1 1999   1 
3 a  1 2000   2 
4 b  2 1999   3 
5 b  2 2000   4 
6 b  2 2000   4 

In [101]: df.dtypes 
Out[101]: 
Name   object 
Name_id   int64 
Year    int64 
yr_name_id category 
dtype: object 

但看你想要的DF,它看起来像要分类只是一个Year列,Name_id + Year

组合
In [102]: df['yr_name_id'] = pd.Categorical(pd.factorize(df.Year)[0] + 1) 

In [103]: df 
Out[103]: 
    Name Name_id Year yr_name_id 
0 a  1 1999   1 
1 a  1 1999   1 
2 a  1 1999   1 
3 a  1 2000   2 
4 b  2 1999   1 
5 b  2 2000   2 
6 b  2 2000   2 

In [104]: df.dtypes 
Out[104]: 
Name   object 
Name_id   int64 
Year    int64 
yr_name_id category 
dtype: object 
0

使用itertools.count

from itertools import count 

counter = count(1) 
df['yr_name_id'] = (df.groupby(['Name_id', 'Year'])['Name_id'] 
         .transform(lambda x: next(counter))) 

输出:

Name Name_id Year yr_name_id 
0 a  1 1999   1 
1 a  1 1999   1 
2 a  1 1999   1 
3 a  1 2000   2 
4 b  2 1999   3 
5 b  2 2000   4 
6 b  2 2000   4 
相关问题