2017-01-10 212 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是生鏽了,所以不要把我的話。