如何通过列表理解动态获取数据框的子集?
How to get dynamically subset of data frame by list comprehension?
我的打算
我喜欢通过 dict
动态过滤数据帧,该数据帧包含 dicts
的 list
以及 column
和 value
信息进行过滤上。
预期结果应如下所示:
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()])
问题
实现过滤器会报错:
KeyError: "brand=='Honda' | model=='a' | brand=='Honda' | model=='b' | brand=='Toyota' | model=='d'"
调整过滤器以将内部的 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
我的打算
我喜欢通过 dict
动态过滤数据帧,该数据帧包含 dicts
的 list
以及 column
和 value
信息进行过滤上。
预期结果应如下所示:
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()])
问题
实现过滤器会报错:
KeyError: "brand=='Honda' | model=='a' | brand=='Honda' | model=='b' | brand=='Toyota' | model=='d'"
调整过滤器以将内部的 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