我的数据框看起来像这样:
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'为每个唯一的Name_id-Year组合增加,然后每个新的Name_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
我尝试过各种各样的事情,看了here,here以及关于groupby和枚举的几个帖子。
首先,我尝试在组合Name_id和Year之后创建一个唯一的字典,然后使用map来分配值,但是当我尝试通过以下方式将Name_id和Year组合为字符串时:
df['yr_name_id'] = str(df['Name_id']) + str(df['Year'])
新专栏具有0 0 1\n1 1\n2 1\n3 1\n4 2\n5 2...
的非唯一语法,我并不十分理解。
我认为我需要帮助lambda的更有前途的方法是使用groupby
df['yr_name_id'] = df.groupby(['Name_id', 'Year'])['Name_id'].transform(lambda x: )#unsure from this point
我对lambda非常不熟悉,所以对我如何做到这一点的任何指导都将不胜感激。
答案 0 :(得分: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
答案 1 :(得分: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