簡體   English   中英

使用 python 為列中的值查找多個超集和子集

[英]Finding multiple supersets and subsets for values in a column with python

我正在嘗試從 excel 文件中查找列(此處為字母列)中包含的值的超集和子集。 數據如下所示:

ID
1 A、B、D、E、F
2 B、C
3
4 D B
5 乙、丁、甲
6 X、Y、Z
7 X, Y
8 乙,丁

例如

  • 'B', 'D,B', 'E,D', 'B,D,A' 是 'A,B,D,E,F' 的子集,
  • 'B' 是 'B,C' 的子集,
  • “X,Y”是“X,Y,Z”的子集。

  • 'A,B,D,E,F'、'B,C' 和 'X,Y,Z' 是超集。

我想在單獨的 excel 文件中顯示並存儲該關系,第一個包括(子集及其超集)第二個包括超集,第一個文件:

ID
1 A、B、D、E、F
5 乙,丁,甲
8 E,D
4 D B
3
2 B,C
3
6 X、Y、Z
7 X, Y

第二個文件:

ID
1 A、B、D、E、F
2 B,C
6 X、Y、Z

一種可能的解決方案是使用itertools.combinations並檢查每個組合是否一個項目的所有元素都在另一個項目中。

為了找到超集,我們使用letter列並將其轉換為元組列表。 然后我們創建所有可能的組合,每個組合都包含該列的兩個元素。 a,b =...是在該特定組合中找到較短的元素。 a總是較短的元素。 如果a的每個字母都在b中並且a在 list out ,那么我們將它從列表中刪除,因為它是另一個元素的子集。 最后, out僅包含數據的supersets 然后我們只需要將列表的元素再次更改為連接字符串並使用該列表過濾df以獲得您的第二個文件(此處稱為df2

您需要知道如何在開始時拆分字符串並在最后加入。 如果數據中有前導或尾隨空格,則需要去除它們,否則最終過濾器將與行不匹配。

lst = df['letter'].values.tolist()
lst = list(tuple(item.strip() for item in x.split(',')) for x in lst)
print(lst)
# [('A', 'B', 'D', 'E', 'F'), ('B', 'C'), ('B',), ('D', 'B'), ('B', 'D', 'A'), ('X', 'Y', 'Z'), ('X', 'Y'), ('E', 'D')]

out = ls[:] #copy of lst

for tup1,tup2 in itertools.combinations(lst, 2):
    a, b = (tup1, tup2) if len(tup1) < len(tup2) else (tup2, tup1)
    # e.g for a,b : (('D','B'), ('B', 'D', 'A'))
    if all(elem in b for elem in a) and a in out:
        out.remove(a)

print(out)
# [('A', 'B', 'D', 'E', 'F'), ('B', 'C'), ('X', 'Y', 'Z')]

filt = list(map(', '.join, out))
df2 = df.loc[df['letter'].isin(filt), :]
print(df2)

Output:

   id         letter
0   1  A, B, D, E, F
1   2           B, C
5   6        X, Y, Z

暫無
暫無

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

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