按列分组后熊猫重命名行



我最近开始使用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的transformapply函数的一些事情,但到目前为止还没有幸运。我怎样才能做到这一点呢?

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

最新更新