从列表生成2×2元组并在python中查找重复元组

从列表生成2×2元组并在python中查找重复元组,python,pandas,tuples,Python,Pandas,Tuples,我是Python的初学者,在数据帧上生成和识别元组上的重复项时遇到困难 首先,我有一个userid列表: 'userid': ["us1", "us2", "us1", "us2", "us4", "us4", "us5", "us1", "us2"] 我想按照用户ID在列表中的顺序生成2×2元组,所以它是: [('

我是Python的初学者,在数据帧上生成和识别元组上的重复项时遇到困难

首先,我有一个userid列表:

'userid': ["us1", "us2", "us1", "us2", "us4", "us4", "us5", "us1", "us2"]
我想按照用户ID在列表中的顺序生成2×2元组,所以它是:

[('us1', 'us2'),
 ('us2', 'us1'),
 ('us1', 'us2'),
 ('us2', 'us4'),
 ('us4', 'us4'),
 ('us4', 'us5'),
 ('us5', 'us1'),
 ('us1', 'us2')]
但是我得到的元组是这个(我不明白为什么):

这是我的密码:

   d = {'id': ["a", "a", "a", "a", "a", "a", "a", "a", "a"], 'id2': ["b", "b", "b", "b", "b", "b", "b", "b", "b"], 'userid': ["us1", "us2", "us1", "us2", "us4", "us4", "us5", "us1", "us2"], "time": [1, 2, 3, 5, 4, 7, 6, 8, 9]}
    df_test = pd.DataFrame(data=d).sort_values('time')
    df_test.groupby(['id','id2']).agg(lambda x: x.tolist()).reset_index()
    test2 = list(zip(df_test.userid[:-1], df_test.userid[1:]))
    zipped_list = test2[:]
    list(test2)
->此外,我的下一步将是查找此元组上的重复项并将其提取为新列表,因此对于元组:

    [('us1', 'us2'),
     ('us2', 'us1'),
     ('us1', 'us2'),
     ('us2', 'us4'),
     ('us4', 'us4'),
     ('us4', 'us5'),
     ('us5', 'us1'),
     ('us1', 'us2')]
应该是列表
[('us1','us2'),3]
,因为它是唯一出现重复的元组,“3”表示出现了3次重复


因此,我找不到按我想要的顺序生成元组的错误,也不知道如何找到重复的元组。

让我们做
frozenset
+
value\u counts

pd.Series(list(map(frozenset,zipped_list))).value_counts()
(us2, us1)    3
(us1, us4)    2
(us2, us5)    1
(us5, us4)    1
(us2, us4)    1
dtype: int64
如果只需要列表重新排序

l=list(map(frozenset,zipped_list))
或者我们可以做
numpy

np.sort(zipped_list,axis=1).tolist()
[['us1', 'us2'], ['us1', 'us2'], ['us1', 'us4'], ['us2', 'us4'], ['us2', 'us5'], ['us4', 'us5'], ['us1', 'us4'], ['us1', 'us2']]
更新:您需要先对值进行
排序
,因此我们需要
对索引进行排序
返回

list(zip(df_test.userid[:-1].sort_index(), df_test.userid[1:].sort_index()))
[('us1', 'us2'), ('us2', 'us1'), ('us1', 'us2'), ('us2', 'us4'), ('us4', 'us4'), ('us4', 'us5'), ('us5', 'us1'), ('us1', 'us2')]

嗨,谢谢你的回答,这很有帮助!!但在这种情况下,输入的元组顺序是错误的。正如我在文章中解释的那样,我希望按照它们在列表中出现的顺序排列,这样就不会重复元组(例如,us1、us4)。你也知道我该怎么做吗?@CatarinaNogueira
list(map(frozenset,zip(df_-test.userid[:-1],df_-test.userid[1:]))
谢谢!但是我使用的正是这个,所以更改了我的代码,在这里我做了我们有的zip:df_test['tuples']=df_test.apply(lambda x:list(map(frozenset,zip(df_test.userid[:-1],df_test.userid[1:]),1)。我在帖子中解释的顺序没有保持,它仍然与你回答的顺序相同,例如:(@CatarinaNogueira)你的问题不清楚,在我看来,在创建之后和创建期间都要改变它result@CatarinaNogueiratolist no list pd.Series(list(map(frozenset,df_test.tuples.tolist()))。
list(zip(df_test.userid[:-1].sort_index(), df_test.userid[1:].sort_index()))
[('us1', 'us2'), ('us2', 'us1'), ('us1', 'us2'), ('us2', 'us4'), ('us4', 'us4'), ('us4', 'us5'), ('us5', 'us1'), ('us1', 'us2')]