我正在处理一个大型数据集(超过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
我该如何实现?任何帮助将不胜感激。
答案 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列以设置团队编号...