首先创建虚拟数据帧,然后我们可以使用矩阵乘法来查看其中一行是否是另一行的完整子集,方法是检查与另一行的乘法总和是否等于该行中的元素数量。 (这会是一个内存密集型)
import pandas as pd
import numpy as np
df = pd.DataFrame({'Cities': [['A','B'], ['A','B','C','D'], ['A','B','C'],
['X'], ['X','Y','Z'], ['Y','Z']]})
arr = pd.get_dummies(df['Cities'].explode()).max(level=0).to_numpy()
#[[1 1 0 0 0 0 0]
# [1 1 1 1 0 0 0]
# [1 1 1 0 0 0 0]
# [0 0 0 0 1 0 0]
# [0 0 0 0 1 1 1]
# [0 0 0 0 0 1 1]]
subsets = np.matmul(arr, arr.T)
np.fill_diagonal(subsets, 0) # So same row doesn't exclude itself
mask = ~np.equal(subsets, np.sum(arr, 1)).any(0)
df[mask]
# Cities
#1 [A, B, C, D]
#4 [X, Y, Z]
就目前情况而言,如果您有两行与最长子集相连(即两行['A','B','C','D']
)两者都被丢弃。如果这不是你想要的,你可以先drop_duplicates
on 'Cities'
(需要转换为可散列类型,例如frozenset
),然后应用上述内容。