2017-01-10 3 views
1

У нас есть таблица SQL, где мы храним все программное обеспечение, которое загружается в момент запуска через нашего компьютерного парка:Panda Dataframe Special Counting

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, чтобы подсчитать, сколько машин имеет определенный автозапуск?

Возвращения мы хотели бы произвести это панда dataframe со всей перечисленной Autoruns (минус machine_id и id) с новой колонкой под названием count, который содержит количество машин этого автозапуск был обнаружен на.

Благодарим вас за помощь.

С наилучшими пожеланиями, Александр

ответ

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 и преобразуется в Dataframe.

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; 

My SQL ржавый, хотя, так что не воспринимайте мое слово.

Смежные вопросы