如何通过列表理解动态获取数据框的子集?

How to get dynamically subset of data frame by list comprehension?

我的打算

我喜欢通过 dict 动态过滤数据帧,该数据帧包含 dictslist 以及 columnvalue 信息进行过滤上。

预期结果应如下所示:

result = {'brand': ['Honda','Honda','Toyota'],
              'model': ['a','b','d']
            }

我的数据框

cars = {'brand': ['Honda','Honda','Honda','Toyota','Toyota','Audi'],
              'model': ['a','b','c','d','a','b'],
            }

我的字典

正在保存有关汽车之间关系的信息:

relation = {
    'relation1':[
        {'brand':'Honda','model':'a'},
        {'brand':'Honda','model':'b'},
        {'brand':'Toyota','model':'d'}
    ],
    'relation2':[
        {'brand':'...','model':'...'},
        {'brand':'...','model':'...'}
    ]
}

我尝试设置列表理解

' | '.join([f'{repr(k)}=={repr(v)}' for d in relation['relation1'] for k,v in d.items()])

问题

  1. 实现过滤器会报错:

    KeyError: "brand=='Honda' | model=='a' | brand=='Honda' | model=='b' | brand=='Toyota' | model=='d'"
    
  2. 调整过滤器以将内部的 dict 值与 & 和外部的 | 组合在一起,因此过滤器看起来像:

    (brand=='Honda' & model=='a') | (brand=='Honda' & model=='b') | (brand=='Toyota' & model=='d')
    

IIUC 你可以简单地做一个 merge:

print (df_cars.merge(pd.DataFrame(relation["relation1"])))

   brand model
0  Honda     a
1  Honda     b

使用嵌套列表理解:

q = ' | '.join([f"({' & '.join(f'{k}=={repr(v)}' for k,v in d.items())})" 
                for d in relation['relation1']])
print (q)
(brand=='Honda' & model=='a') | 
(brand=='Honda' & model=='b') | 
(brand=='Toyota' & model=='b')


df = df.query(q)
print (df)
    brand model
0   Honda     a
1   Honda     b
3  Toyota     d