[英]Generating 2-by-2 tuples from list and finding the duplicated tuples in python
我是 Python 的初學者,在我的 dataFrame 上的元組上生成和識別重復項時遇到問題。
首先我有這個用戶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 次重復。
因此,我找不到按我想要的順序生成元組的錯誤,也不知道如何找到重復項。
讓我們做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')]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.