2016-01-22 23 views
0

我有一個Pandas DataFrame,其中包含從外部源收集的腳本。列text_content包含腳本內容。最長的腳本由85.617個字符組成。在熊貓數據框中標記文本

樣本給你一個想法:

Sample contents

這些腳本包含表名和其他有用的信息。目前,數據幀被寫入到SQLite數據庫表中,然後可以使用ad-hoc SQL語句進行搜索(並分發給更多人羣)。

一個常見的用例是我們將有一個表名列表,並想知道它們出現的腳本。如果我們需要在SQL中執行此操作,則需要我們使用LIKE運算符執行通配符搜索,這在性能方面很糟糕。

因此,我想從腳本提取,同時它還是一個數據幀,導致兩列的表,每行包括:

  • 原來的腳本行的鏈接
  • 這是在腳本

每個腳本將導致的行數(取決於比賽的量)中找到一個單詞。

到目前爲止,我寫了這個從腳本中提取的話:

DataFrame(df[df.text_type == 'DISCRIPT'] 
    .dropna(subset=['text_content']) 
    .apply(lambda x: re.findall('([a-zA-Z]\w+)', x['text_content']), axis=1) 
    .tolist()) 

結果:

Tokenized

到目前爲止,一切都很好(?)。

還有兩個步驟需要經過,但我有點卡在這裏。

  1. 刪除常用單詞列表(例如SQL保留字)。
  2. 重塑DataFrame,使每行都匹配,但鏈接到原始DataFrame中的腳本。

我可以用T移調數據幀,結合使用replace()關鍵字(與NA值替換它們),最後用dropna()的預設列表列表縮短爲只需將關鍵字。但是,我不確定這是否是最好的方法。

我非常感謝您的意見和建議!

回答

1

IIUC你可以嘗試添加index=df.indexdf2構造,然後通過stack和過濾通過isin重塑:

print df 
          text_content text_name text_type 
1614 CHECK FOR LOCK STATUS CACHETABLEDB  TEXT DISCRIPT 
1615 CHECK FOR LOCK STATUS CACHETABLEDB  TEXT DISCRIPT 

df2 = pd.DataFrame(df[df.text_type == 'DISCRIPT'] 
    .dropna(subset=['text_content']) 
    .apply(lambda x: re.findall('([a-zA-Z]\w+)', x['text_content']), axis=1) 
    .tolist(), index=df.index) 
print df2 
      0 1  2  3    4 
1614 CHECK FOR LOCK STATUS CACHETABLEDB 
1615 CHECK FOR LOCK STATUS CACHETABLEDB 

#reshape all rows to column 
df2 = df2.stack().reset_index(level=0) 
df2.columns = ['id', 'words'] 

L = ['CACHETABLEDB','STATUS'] 
#remove reserved words 
df2 = df2.loc[~df2.words.isin(L)].reset_index(drop=True) 
print df2 
    id words 
0 1614 CHECK 
1 1614 FOR 
2 1614 LOCK 
3 1615 CHECK 
4 1615 FOR 
5 1615 LOCK