我有一个数据库表flight
pkid from_city to_city
1 Melbourne BuenosAires
2 Budapest Tokyo
3 Praslin Anchorage
然后我有一些随机的to_cities ['Paris','Tokyo','Madrid','Anchorage','im_not_on_earth']
现在使用sqlalchemy元数据,我想要一个查询,如果给定列表中存在匹配的pkid
,则返回一个to_city
;如果不存在,返回一个默认值,说0
存在
所以基本上,我的输出肯定会为每个城市肯定地给我一些整数,我可以将输出中的每个整数映射到给定输入中的某个城市
以下任何示例输出都将对我有用-
{'Paris':0, 'Tokyo': 2, 'Madrid': 0, 'Anchorage': 3, 'im_not_on_earth': 0}
或简单地……[0,2,0,3,0]
有关如何执行此操作的任何想法或建议?我以为可以通过合并来实现此目的。但这仅在db表中存在where子句的值时才有效。不确定我对合并的理解是否正确。
编辑: ** 我不想使用for循环并查询给定输入中的每个元素 **
答案 0 :(得分:1)
您可以使用apply()
并定义自己的函数,例如:
def get_id(x):
find = flight[flight['to_city']==x]['pkid'].values
match = find[0] if list(find) else 0
return match
dict(zip(to_cities, pd.Series(to_cities).apply(get_id).values))
收益:
{'Paris': 0, 'Tokyo': 2, 'Madrid': 0, 'Anchorage': 3, 'im_not_on_earth': 0}
答案 1 :(得分:0)
您想要在提供的城市列表和广告投放表中的to_city列之间进行外部联接的内容。由于数据库不了解您提供的城市列表,因此您必须使用循环将其加入应用程序代码中。在示例代码中,每个to_city也仅出现在一个数据库行中,因此仅映射到一个pkid。我假设可能有多个不同的from_cities拥有前往相同to_city的航班,因此您将需要将每个to_city映射到pkid列表而不是单个值。因此,没有航班前往的to_city将由一个空列表而不是0表示。
您可以通过单个数据库查询来检索匹配城市的列表,但是您将需要循环以使用提供的to_cities列表进行外部联接。下面的代码应实现您想要的。由于您尚未提供sqlalchemy代码,因此我假设您正在使用带有声明式系统的ORM来定义表。
from collections import defaultdict
class Flight(Base):
__tablename__ = 'flight'
pkid = Column(Integer, primary_key=True)
from_city = Column(String)
to_city = Column(String)
to_cities = ['Paris','Tokyo','Madrid','Anchorage','im_not_on_earth']
query_result = session.query(Flight.to_city, Flight.pkid).filter(Flight.to_city.in_(to_cities)).all()
matching_cities = defaultdict(list)
for city, pkid in query_result:
matching_cities[city] += [pkid]
result = {city: matching_cities.get(city, []) for city in to_cities}
由于您必须在应用程序代码中进行外部联接,因此值得考虑一下数据库设计。数据库将是执行此操作的有效场所。如果您有一个包含所有城市名称的单独表,且该表与航班表具有外键关系,那么您可以通过在查询中的城市和航班表之间进行外部联接来在单个查询中实现所需的目标。