我们有一个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_id
和id
),其中包含一个名为count
的新列,其中包含此机器的数量autorun被发现了。
非常感谢您的协助。
亲切的问候, 亚历山大
答案 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 BY
和COUNT
功能(实际上我认为这是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抓取我们的数据库并转换为数据帧。