我最近开始使用Pandas来操作一些数据,我现在正试图匿名化groupBy
之后的一些列,以查找人员的唯一出现。
例如,假设如下DF:
First Name Last Name DOB
0 Bob One 28/05/1973
1 Bob One 28/05/1973
2 Ana Two 28/07/1991
3 Ana Two 28/07/1991
4 Ana Two 28/07/1991
5 Jim Three 07/01/1994
我可以很容易地找到唯一的人的名字,姓氏和出生日期使用df.groupby(['First Name', 'Last Name', 'DOB'])
。
但是,我想对每个唯一的组合应用一个函数,将这些名称转换为已知的匿名(增量)版本。
First Name Last Name DOB
0 F1 L1 28/05/1973
1 F1 L1 28/05/1973
2 F2 L2 28/07/1991
3 F2 L2 28/07/1991
4 F2 L2 28/07/1991
5 F3 L3 07/01/1994
我已经尝试了DF groupBy的transform
和apply
函数的一些事情,但到目前为止还没有幸运。我怎样才能做到这一点呢?
ids = (df.groupby(["FirstName", "LastName", "DOB"], sort=False)
.ngroup().add(1)
.astype(str))
df["FirstName"] = "F" + ids
df["LastName"] = "L" + ids
在组号(ngroup)上识别名字、姓氏和DOB三元组的id
- sort=False帮助它保留看到的顺序
- ngroup是基于0的,所以我们添加(1)
然后添加前缀"F"one_answers";L",并分配给适当的列
,
>>> df
FirstName LastName DOB
0 F1 L1 28/05/1973
1 F1 L1 28/05/1973
2 F2 L2 28/07/1991
3 F2 L2 28/07/1991
4 F2 L2 28/07/1991
5 F3 L3 07/01/1994
其中ids
为
>>> ids
0 1
1 1
2 2
3 2
4 2
5 3
dtype: object
您可以使用pd.factorize
:
>>> df.assign(**{'First Name': pd.factorize(df['First Name'])[0],
'Last Name': pd.factorize(df['Last Name'])[0]})
First Name Last Name DOB
0 0 0 28/05/1973
1 0 0 28/05/1973
2 1 1 28/07/1991
3 1 1 28/07/1991
4 1 1 28/07/1991
5 2 2 07/01/1994