根据两列之间的关系创建唯一的ID

时间:2019-02-17 13:56:34

标签: python pandas networkx

我正在处理一个大型数据集(超过2M行),如下所示:

                                                     echo '<tr>' .                                                              '<td><a href="#" class="people-editable" data-name="name" data-type="text" data-title="Имя" data-pk="' . $rows[0] . '" data-url="ajax.php" >' . $row['clerk_notes'] . '</a></td>' .                                                             '</tr>';

在这种情况下,TeamId 504和602相同,601与605匹配,但与777不匹配(因为它在团队中还有一个人)。

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

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

一个人可以是1人一组,就像UserId 727一样:他是团队504(具有UserId 722)和团队100(独立)的一部分。这应该为两个团队生成2个不同的唯一ID。

我不能仅按TeamId分组,因为它将把TeamId 504和602检测为不同的团队,我也不能按UserId进行分组,因为它将无法跟踪团队。

据我了解,这可能是网络问题。我在这里找到了与此类似的查询: Groupby two column values and create a unique id

我该如何实现?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分: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 提醒:别忘了订购NewVar

答案 1 :(得分:0)

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

然后为了能够获得UniqueId,您可以按所有列sort_values,在两行之间使用diff,查找每行是否any是不同组的含义,{{ 1}},例如:

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

答案 2 :(得分:0)

使用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列以设置团队编号...