首页 > 解决方案 > 从 Flask SQLAlchemy 表中获取所有唯一值及其出现次数

问题描述

我有一个烧瓶应用程序,用户可以在其中使用关键字标记他们的帖子。这些标签由空格分隔,并存储在tags列中的以下模型中。

class Post(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), unique=False, nullable=False)
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    content = db.Column(db.Text, unique=True, nullable=False)
    urls = db.Column(db.String(1000), unique=False, nullable=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    tags = db.Column(db.String(400), unique=False, nullable=True)
    upvotes = db.Column(db.Integer, unique=False, nullable=False, default=0)

    def __repr__(self):
        return f"Post ('{self.title}', '{self.date_posted}')"

我想获得一个可以发布到 html 页面的表格,其中列出了所有唯一标签及其出现的次数(按出现次数排序,降序排列)。

尝试 因此,为了做到这一点,我认为我需要 1)。获取所有标签;2)。循环遍历它们以按空格分割 (tag.split(' ')); 3)。将它们附加回数据框;4)。循环计算出现次数。

这似乎不是一种非常有效的方法。但是我仍然尝试过,这就是我所拥有的。

获取所有标签

all_tags = Post.query.with_entities(Post.tags)

获取所有唯一标签

unique_tags = Post.query.with_entities(Post.tags).distinct()

获取标签计数(不起作用)

counts = pd.Series(Post.query.with_entities(Post.tags)).value_counts()

但这会计算整个标签字符串,而不是由“”分隔的单个标签。我觉得这应该很简单,但我不能完全解决。我怎样才能做到这一点?

这是一些可以使用的虚拟数据:

df = pd.DataFrame({'Index': {0: 0, 1: 1, 2: 2, 3: 3},
 'tags': {0: 'tag1 tag2',
  1: 'tag3 tag4',
  2: 'tag5 tag6 tag7',
  3: 'tag2 tag3 tag4 tag1'}})

期望的结果类似于...

{'tag1': {0: 'tag2', 1: 'tag3', 2: 'tag4', 3: 'tag5', 4: 'tag6', 5: 'tag7'},

'2': {0: 2, 1: 2, 2: 2, 3: 1, 4: 1, 5: 1}}

标签: pandasflaskflask-sqlalchemy

解决方案


这是你想要的吗:

pd.Series(df.tags.str.split(' ').sum()).value_counts()

Out[659]:
tag1    2
tag4    2
tag3    2
tag2    2
tag6    1
tag7    1
tag5    1
dtype: int64

推荐阅读