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



关于以下Pandas数据帧,

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"one_answers"D001"作为答案,因为这两个位置的"A"列中都有列表中提到的值。此外,你能建议一个更快的实现吗?因为我必须处理真正的大数据集。

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

search = {10, 20}
idx = (set(df[df['A'] == i].index.get_level_values(0)) for i in search)
res = set.intersection(*idx)

基本-

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']level 0分组,并为您提供列表-

ID
A001            [10]
B001    [10, 20, 30]
C001            [20]

接下来,对于这些列表中的每一个,我们将其转换为一个集合,并检查search_list是否是子集。

ID
A001    False
B001     True
C001    False

它返回布尔值的Series,然后可以用作掩码-

print(op[op['A']]['ID'])

最终输出-

1    B001

最新更新