Pandas Dataframe Special Counting

时间:2017-01-10 05:28:44

标签: python pandas dataframe count

我们有一个SQL表,我们存储在计算机机群中启动时启动的所有软件:

class Autoruns(Base):
    """Table that stores all of the autoruns."""

    __tablename__ = 'autoruns'

    id = Column(Integer, primary_key=True, autoincrement=True)

    # Table keys
    machine_id = Column(String, ForeignKey("machines.id"), nullable=False)
    type = Column(String)
    path = Column(String)
    entry = Column(String)
    data = Column(String)
    md5_hash = Column(String)
    is_signed = Column(Boolean)

    # Unique constraint
    __table_args__ = (
    UniqueConstraint('machine_id', 'type', 'path', 'entry', 'data', 'md5_hash', 'is_signed'),)

machine_id是一个外键整数,指向具有自动运行行的机器的IP地址。

如果将自动运行定义为['type', 'path', 'entry', 'data', 'md5_hash', 'is_signed'],我们如何使用Pandas Dataframes来计算有多少台机器具有特定的自动运行?

我们想要生成的回报是一个熊猫数据框,其中列出了所有自动运行版(减去machine_idid),其中包含一个名为count的新列,其中包含此机器的数量autorun被发现了。

非常感谢您的协助。

亲切的问候, 亚历山大

2 个答案:

答案 0 :(得分:2)

棘手的部分(并不是那么棘手)是将SQL数据库中的数据转换为DataFrame。您应该可以使用pandas.read_sql_table()。我认为,根据文档,它会像

那样
df = read_sql_table('autoruns', connection_object)

但您可能需要进行实验。

获得DataFrame后,您可以按如下方式使用groupby()

df.groupby(
    ['type', 'path', 'entry', 'data', 'md5_hash', 'is_signed']
).count().reset_index()

groupby(...).count()调用会创建另一个DataFrame,其中MultiIndex有六个级别,对应于自动运行的六个组件,然后reset_index()会将这些级别转换为列。

当然,我认为在纯SQL中也可以这样做,因为SQL确实具有GROUP BYCOUNT功能(实际上我认为这是Pandas开发人员获得的功能理念)。确切的咒语将取决于您的特定SQL实现,但可能类似于

SELECT COUNT(*) FROM autoruns GROUP BY type, path, entry, data, md5_hash, is_signed;

我的SQL很生疏,所以不要接受我的话。

答案 1 :(得分:1)

我非常感谢大卫指出我正确的方向。

我解决了这个问题:

res = panda.copy(deep=True)
res = res.drop('id', 1)
res = res.drop('machine_id', 1)
res = res.groupby(res.columns.tolist()).size().reset_index(name="count")
return res.sort_values('count')

panda是我的autoruns列表,使用SQL抓取我们的数据库并转换为数据帧。