提问者:小点点

从list生成2乘2元组并在python中查找重复的元组


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

首先,我有以下用户ID列表:

'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')]

但是我到达的元组是这样的(我不明白为什么):

 [('us1', 'us2'),
 ('us2', 'us1'),
 ('us1', 'us4'),
 ('us4', 'us2'),
 ('us2', 'us5'),
 ('us5', 'us4'),
 ('us4', '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倍

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

感谢任何帮助!! 谢谢


共1个答案

匿名用户

让我们执行frozenset+value_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']]

更新:您首先sort_values,因此我们需要返回sort_index

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')]