Python 高效、快速地实现在数据帧中查找和匹配唯一值

Python 高效、快速地实现在数据帧中查找和匹配唯一值,python,python-3.x,performance,pandas,indexing,Python,Python 3.x,Performance,Pandas,Indexing,关于以下数据帧 idx = pd.MultiIndex.from_product([['A001', 'B001','C001'], ['0', '1', '2']], names=['ID', 'Entries']) col = ['A', 'B'] df = pd.DataFrame('-', idx, col) df.loc['A001', 'A'] =

关于以下数据帧

idx = pd.MultiIndex.from_product([['A001', 'B001','C001'],
                                  ['0', '1', '2']],
                                 names=['ID', 'Entries'])
col = ['A', 'B']

df = pd.DataFrame('-', idx, col)
df.loc['A001', 'A'] = [10,10,10]
df.loc['A001', 'B'] = [90,84,70]
df.loc['B001', 'A'] = [10,20,30]
df.loc['B001', 'B'] = [70,86,67]
df.loc['C001', 'A'] = [20,20,20]
df.loc['C001', 'B'] = [98,81,72]
df.loc['D001', 'A'] = [20,20,10]
df.loc['D001', 'B'] = [68,71,92]
#df is a dataframe
df
我很想知道哪些ID包含了“a”列中集合或列表中的所有值。让我们定义一个值为[10,20]的列表。在这种情况下,我应该得到位置“B001”和“D001”作为答案,因为这两个位置的“A”列中都有列表中提到的值。 此外,您能否建议更快的实施,因为我必须处理真正的大数据集。

基本上-

search_list = {10,20}
op = df.groupby(level=0)['A'].apply(lambda x: search_list.issubset(set(x))).reset_index()
print(op[op['A']]['ID'])
感谢@Ben.T删除不必要的
unique()

输出

1    B001
Name: ID, dtype: object
解释

df.groupby(level=0)['A']
groupby
level 0
并提供以下列表-

ID
A001            [10]
B001    [10, 20, 30]
C001            [20]
接下来,对于这些列表中的每一个,我们将其转换为一个集合,并检查
搜索列表
是否是一个子集

ID
A001    False
B001     True
C001    False
它返回一系列布尔值,这些值可以用作掩码-

print(op[op['A']]['ID'])
最终产出-

1    B001
基本上-

search_list = {10,20}
op = df.groupby(level=0)['A'].apply(lambda x: search_list.issubset(set(x))).reset_index()
print(op[op['A']]['ID'])
感谢@Ben.T删除不必要的
unique()

输出

1    B001
Name: ID, dtype: object
解释

df.groupby(level=0)['A']
groupby
level 0
并提供以下列表-

ID
A001            [10]
B001    [10, 20, 30]
C001            [20]
接下来,对于这些列表中的每一个,我们将其转换为一个集合,并检查
搜索列表
是否是一个子集

ID
A001    False
B001     True
C001    False
它返回一系列布尔值,这些值可以用作掩码-

print(op[op['A']]['ID'])
最终产出-

1    B001

您可以使用
set.intersection
进行计算,并使用
pd.Index.get_level_值
提取索引的第一级:

search = {10, 20}

idx = (set(df[df['A'] == i].index.get_level_values(0)) for i in search)

res = set.intersection(*idx)

您可以使用
set.intersection
进行计算,并使用
pd.Index.get_level_值
提取索引的第一级:

search = {10, 20}

idx = (set(df[df['A'] == i].index.get_level_values(0)) for i in search)

res = set.intersection(*idx)

我认为,
unique
是不必要的,因为在
apply
:)@Ben.T中使用
set(x)
后,这只是以防万一,正如OP指出的那样,这将是一个大数据集,而现实世界中的数据充满了这些。但我同意你说的有道理!我会编辑它。我认为,
唯一的
是不必要的,因为你在
应用
:)@Ben.T中使用
设置(x)
,以防万一,正如OP指出的那样,这将是一个大数据集,而现实世界中的数据充满了这些。但我同意你说的有道理!我将编辑它
set。交叉点
非常快。这个在大数据集上的实现每个循环需要71纳秒±5.34纳秒(平均±标准偏差7次,每个循环1000000次)。
set.intersection
非常快。这个在大数据集上的实现每个循环需要71纳秒±5.34纳秒(平均±标准偏差为7次,每个循环1000000次)。