Python 从bool为true的副本中获取一个,如果没有,则返回
我有以下数据:Python 从bool为true的副本中获取一个,如果没有,则返回,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,我有以下数据: id | name | some_value | active -------------------------------- 1 | test | 1234 | false 2 | toast | qwert | false 3 | test | 4321 | true 4 | toast | trewq | false 我想得到一个每个名字都是“唯一”的列表。另外,我想得到那些活动的为真,如果没有找到真值,则返回数
id | name | some_value | active
--------------------------------
1 | test | 1234 | false
2 | toast | qwert | false
3 | test | 4321 | true
4 | toast | trewq | false
我想得到一个每个名字都是“唯一”的列表。另外,我想得到那些活动的为真,如果没有找到真值,则返回数据库中的最后一项
目前我有以下几点:
#/usr/bin/env蟒蛇3
进口稀土
从sqlalchemy导入创建\引擎、列、整数、字符串、布尔值和\或_
从sqlalchemy.orm导入sessionmaker
从sqlalchemy.sql导入函数
从sqlalchemy.ext.declarative导入为_declarative,声明为_attr
PATTERN=re.compile(r)(?不访问数据库这有点难解决,但取消布局过程可能如下所示:
样本数据:
import pandas as pd
df = pd.DataFrame({'id': {0: 1, 1: 2, 2: 3, 3: 4},
'name': {0: 'test', 1: 'toast', 2: 'test', 3: 'toast'},
'some_value': {0: '1234', 1: 'qwert', 2: '4321', 3: 'trewq'},
'active': {0: False, 1: False, 2: True, 3: False}})
df = df.groupby(['name', 'active'], as_index=False)[['id', 'some_value']].last()
df = df.sort_values(by=['active'], ascending=False)
df = df.drop_duplicates(subset=['name'])
df = df.set_index('id')
# name active some_value
# id
# 3 test True 4321
# 4 toast False trewq
代码:
import pandas as pd
df = pd.DataFrame({'id': {0: 1, 1: 2, 2: 3, 3: 4},
'name': {0: 'test', 1: 'toast', 2: 'test', 3: 'toast'},
'some_value': {0: '1234', 1: 'qwert', 2: '4321', 3: 'trewq'},
'active': {0: False, 1: False, 2: True, 3: False}})
df = df.groupby(['name', 'active'], as_index=False)[['id', 'some_value']].last()
df = df.sort_values(by=['active'], ascending=False)
df = df.drop_duplicates(subset=['name'])
df = df.set_index('id')
# name active some_value
# id
# 3 test True 4321
# 4 toast False trewq
如果无法访问数据库,则很难解决此问题,但取消支付过程可能如下所示:
样本数据:
import pandas as pd
df = pd.DataFrame({'id': {0: 1, 1: 2, 2: 3, 3: 4},
'name': {0: 'test', 1: 'toast', 2: 'test', 3: 'toast'},
'some_value': {0: '1234', 1: 'qwert', 2: '4321', 3: 'trewq'},
'active': {0: False, 1: False, 2: True, 3: False}})
df = df.groupby(['name', 'active'], as_index=False)[['id', 'some_value']].last()
df = df.sort_values(by=['active'], ascending=False)
df = df.drop_duplicates(subset=['name'])
df = df.set_index('id')
# name active some_value
# id
# 3 test True 4321
# 4 toast False trewq
代码:
import pandas as pd
df = pd.DataFrame({'id': {0: 1, 1: 2, 2: 3, 3: 4},
'name': {0: 'test', 1: 'toast', 2: 'test', 3: 'toast'},
'some_value': {0: '1234', 1: 'qwert', 2: '4321', 3: 'trewq'},
'active': {0: False, 1: False, 2: True, 3: False}})
df = df.groupby(['name', 'active'], as_index=False)[['id', 'some_value']].last()
df = df.sort_values(by=['active'], ascending=False)
df = df.drop_duplicates(subset=['name'])
df = df.set_index('id')
# name active some_value
# id
# 3 test True 4321
# 4 toast False trewq
我认为排序/排名可以解决这个问题:
expr = func.rank().over(partition_by=self.model.name, order_by=[self.model.active.desc(), self.model.id.desc()]).label("therank")
subq = db.query(self.model.id, expr).subquery("subq")
q = db.query(self.model).join(subq, self.model.id == subq.c.id).filter(subq.c.therank == 1)
return q.all()
我认为排序/排名可以解决这个问题:
expr = func.rank().over(partition_by=self.model.name, order_by=[self.model.active.desc(), self.model.id.desc()]).label("therank")
subq = db.query(self.model.id, expr).subquery("subq")
q = db.query(self.model).join(subq, self.model.id == subq.c.id).filter(subq.c.therank == 1)
return q.all()
我把我的问题更新为完全可执行我把我的问题更新为完全可执行谢谢,我来看看这个谢谢,我来看看这个