2017-01-10 167 views
1

我们有我们存储所有的软件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 Dataframe来计算有多少台机器具有特定的自动运行?

我们希望产生的回报是熊猫数据框与一个名为count新列包含机器自动运行这个发现在数量列出的所有自动运行(减去machine_idid)。

非常感谢您的帮助。

亲切的问候, 亚历山大

回答

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是我的自动运行列表中抢下使用SQL数据库我们并转换成数据帧。

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 6级,相当于一个自动运行的六个组件,然后reset_index()会将这些级别转换为列。

当然,我认为在纯SQL中也可以这样做,因为SQL确实有GROUP BYCOUNT的功能(实际上我认为这是熊猫开发人员的想法)。确切的咒语将取决于特定的SQL实现,但大概就像

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

我的SQL是生锈了,所以不要把我的话。