pandas Panda按列分组后重命名行

iyzzxitl  于 2023-01-07  发布在  其他
关注(0)|答案(2)|浏览(161)

我最近开始玩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函数,但到目前为止还没有成功。我该如何实现呢?

sqserrrh

sqserrrh1#

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”和“L”添加到ID并分配给相应的列

得到

>>> 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
laik7k3q

laik7k3q2#

您可以使用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

相关问题