基于两列之间的关系创建唯一id

2024-03-28 08:24:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是一个大数据集(2M+行),如下所示:

Id  TeamId  UserId
43  504     722
44  504     727
45  601     300
46  602     722
47  602     727
48  605     300
49  777     300
50  777     301
51  788     400
52  789     400
53  100     727

在本例中,teamid504和602是相同的,601与605匹配,但与777不匹配(因为它在团队中还有一个人)。你知道吗

我的目标是为每个“唯一”团队生成唯一的ID:

Id  TeamId  UserId  UniqueId
43  504     722     0
44  504     727     0
45  601     300     1
46  602     722     0
47  602     727     0
48  605     300     1
49  777     300     2
50  777     301     2
51  788     400     3
52  789     400     3
53  100     727     4

一个人可以在一个1人的团队中,比如userid727:他是团队504(userid722)和团队100(单独)的一部分。这将为两个团队生成两个不同的唯一ID。你知道吗

我不能只按TeamId分组,因为它会将teamid504和602检测为不同的团队,也不能按UserId分组,因为它不会跟踪团队。你知道吗

据我所知,这可能是一个网络问题。我在这里发现了一个类似的问题: Groupby two column values and create a unique id

我怎样才能做到这一点?任何帮助都将不胜感激。你知道吗


Tags: 数据网络id目标团队groupbyuseridtwo
3条回答

可以使用pivot_table在索引TeamId和列UserId中获取,每行显示每个团队中的用户,例如:

dfp = df.pivot_table( values='Id', index='TeamId', columns='UserId', 
                      aggfunc=np.any, fill_value=False)
print (dfp)                            
UserId    300    301    400    722    727
TeamId                                   
100     False  False  False  False   True
504     False  False  False   True   True
601      True  False  False  False  False
602     False  False  False   True   True
605      True  False  False  False  False
777      True   True  False  False  False
788     False  False   True  False  False
789     False  False   True  False  False

然后为了能够得到唯一的ID,您可以sort_values按所有列,使用两行之间的diff,查找如果any每行表示不同的组和cumsum例如:

print (dfp.sort_values(dfp.columns.tolist()).diff().any(1).cumsum())
TeamId
100    0
504    1 #same number for 504 and 602 but not 100 as you want
602    1
788    2
789    2
601    3
605    3
777    4
dtype: int64

因此,要获得新列,可以使用map

df['UniqueId'] = df.TeamId.map(dfp.sort_values(dfp.columns.tolist())
                                  .diff().abs().any(1).cumsum())
print (df)
    Id  TeamId  UserId  UniqueId
0   43     504     722         1
1   44     504     727         1
2   45     601     300         3
3   46     602     722         1
4   47     602     727         1
5   48     605     300         3
6   49     777     300         4
7   50     777     301         4
8   51     788     400         2
9   52     789     400         2
10  53     100     727         0

为每一行创建一个新变量(可能是一个元组),其中包含该团队的成员。你知道吗

Id  TeamId  UserId  NewVar
43  504     722     (722, 727)
44  504     727     (722, 727)
45  601     300     (300)
46  602     722     (722, 727)
47  602     727     (722, 727)
48  605     300     (300)
49  777     300     (300, 301)
50  777     301     (300, 301)
51  788     400     (400)
52  789     400     (400)
53  100     727     (727)

在此步骤之后,比较NewVar并分配id 附言:别忘了订新的

使用2个groupby得到以下结果:

import pandas as pd

df = pd.DataFrame( {'Id'    :[43,44,45,46,47,48,49,50,51,52,53],
                    'TeamId':[504,504,601,602,602,605,777,777,788,789,100],
                    'UserId':[722,727,300,722,727,300,300,301,400,400,727]})

df_grouped = df.groupby('TeamId')['UserId'].apply(tuple).to_frame().reset_index()

df_grouped = df_grouped.groupby('UserId')['TeamId'].apply(tuple).to_frame().reset_index()

print(df_grouped)

结果:

       UserId      TeamId
0      (300,)  (601, 605)
1  (300, 301)      (777,)
2      (400,)  (788, 789)
3  (722, 727)  (504, 602)
4      (727,)      (100,)

只需迭代TeamId列来设置团队编号。。。你知道吗

相关问题 更多 >