鉴于状态和值的字典,我想过滤表行:
my_join_data = [
{
"status": "status0",
"value": 20,
},
{
"status": "status1",
"value": 25,
},
]
表格值:
id status value
0 status0 10
1 status0 25
2 status0 30
3 status1 10
4 status1 35
my_join_data来自外部源,因此无法将其存储到数据库。 我想将my_join_data转换为类似于sqlalchemy表的对象,因此以后可以用等效于以下方式的联接和过滤:
joined_table = my_table.join(
my_join_data,
my_join_data.c.status == my_table.c.status
)
query = sqlalchemy.select([
my_table.c.id,
my_table.c.status,
my_table.c.value,
]).select_from(
joined_table
).where(
my_join_data.c.value < my_table.c.value
)
预期结果是
id status value
1 status0 25
2 status0 30
4 status1 35
有什么办法可以做到这一点?数据库是PostgreSQL
答案 0 :(得分:1)
您不能使用数据库外部的表来过滤sqlalchemy语句中的SQL表,而不上传它或编写复杂的case语句。
您可以将join_data和SQL表都加载到Pandas DataFrames中,然后进行联接和过滤。
首先,我将字典列表压缩成一个字典。
status_list = []
value_list = []
for dict in my_join_data:
status_list.append(dict["status"])
value_list.append(dict["value"])
join_dict = {'status': status_list, 'value': value_list}
然后将它们都读入DataFrame。
import pandas as pd
join_df = pd.DataFrame.from_dict(join_dict)
sql_df = pd.read_sql_query(query, engine)
然后将两者合并并过滤。
merged_df = sql_df.merge(join_df, how='left', on='status', suffixes=('', '_filter'))
filtered_df = merged_df.loc[merged_df['value_filter'] < merged_df['value']]
filtered_df.drop(columns='value_filter')