簡體   English   中英

使用Pandas檢查2個系列中的值對的最有效方法是?

[英]Most efficient way with Pandas to check pair of values from 2 series?

可以說我有一個序列/數據框A ,看起來像

A = [3,2,1,5,4,...

A也可以排序,因為這對我來說無關緊要。 我想創建一個新的系列來跟蹤可能的配對。 也就是說,我希望結果看起來像

B = [3_1, 3_2, 3_4, ..., 2_1, 2_4, ..., 1_4, 1_5,...

也就是說,我想排除2_3 ,因為3_2已經存在。 我想我可以使用類似的方法在B創建每個元素

for i in A:
    for j in A:
        s = A[i].astype(str) + '_' + A[j].astype(str)
        B.append(pd.Series([s]))

但是我不確定如何確保(i,j)配對不存在,例如確保沒有如上所述添加2_3

解決這個問題的最有效方法是什么?

from itertools import combinations

s = pd.Series([1, 2, 3, 4])
s2 = pd.Series("_".join([str(a), str(b)]) for a, b in combinations(s, 2))

>>> s2
0    1_2
1    1_3
2    1_4
3    2_3
4    2_4
5    3_4
dtype: object

我認為這與大熊貓並沒有太大關系,除了一系列值(可能是結束值)之外。 相反,我會使用itertools

假設你有一個可迭代的a值。 然后

import itertools

set((str(i) + '_' + str(j)) for (i, j) in itertools.product(a, a) if i <= j)

將創建一組對,其中_之前的整數不大於其后的整數,並刪除重復項。


import itertools

>>> set((str(i) + '_' + str(j)) for (i, j) in itertools.product(a, a) if i < j)
{'1_2',
 '1_3',
 '1_4',
 '1_6',
 '1_7',
 '2_3',
 '2_4',
 '2_6',
 '2_7',
 '3_4',
 '3_6',
 '3_7',
 '4_6',
 '4_7',
 '6_7'}

這可以通過列表理解來完成:

>>> a = [3, 2, 1, 5, 4]
>>> [(str(x)+'_'+str(y)) for x in a for y in a if y>x]
['3_5', '3_4', '2_3', '2_5', '2_4', '1_3', '1_2', '1_5', '1_4', '4_5']

請注意,由於y>x語句,對結果中成對的成員的排序進行了排序,這就是為什么我們在輸出中使用'1_3'而不是'3_1'

雖然導入itertools並使用組合是執行此操作的正確方法,但如果我只需要從庫中獲取一兩個內容(也可以通過直接方式輕松完成),則通常不希望導入庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM