2015-08-14 199 views
0

到Python非常新的,但我有PHP和R.一些經驗將數據添加到數據框與Python(熊貓)

我炮製了下面的代碼片段:

import os, glob, pandas as pd, numpy as np 

# Create empty dataframe with correct column names 
columns = ["fileName", "sentence" ] 
df = pd.DataFrame(data=np.zeros((0,len(columns))), columns=columns) 

# Create correct path where to fetch files 
subdir = "\\testdata" 
path = os.getcwd()+subdir 

# Loop files in folder 
for file in glob.glob(path+"\\*.lst"): 
    # If file is readable 
    if os.access(file, os.R_OK): 
     # Find lines inside files 
     lines = [line.rstrip("\n") for line in open(file)] 
     # For each line, do something 
     for line in lines: 
      # I need some help here 
      print(os.path.basename(file)[:-4]) 
      print(line) 

目標是循環文件,從這些文件獲取內容並將它們附加到數據框df。但有一個問題:每個文件應該提取的內容應該是,每行。這個問題是Python替代a similar question I had for R

比方說,我只有兩個文件。第一個包含三行,第二個包含兩行。

adapter.WR-PPF.lst

/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000026.data.ids.xml: <sentence>Een aanpassingseenheid (adapter) , aangebracht in een behuizing voornamelijk bestaande uit in- en uitvoereenheden , een koppeleenheid , een geheugeneenheid , een besturingseenheid (met actieve en passieve elementen en monolitische geïntegreerde schakelingen) en een elektrische voedingseenheid . &gt;</sentence> 
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000026.data.ids.xml: <sentence>Het toestel (adapter) draagt zorg voor de overbrenging van gegevens , met een snelheid van 10 Mbps (megabits per seconde) , tussen meerdere automatische gegevensverwerkende machines in een digitaal netwerk .</sentence> 
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000034.data.ids.xml: <sentence>Overwegende dat deze sensoren niet zijn ontworpen op de installatie van een gepantserde kabel ; dat de mogelijkheid moet worden geboden dat de gepantserde kabel niet verplicht wordt gesteld voor de aansluiting tussen de sensor en de adapter , maar alleen van de adapter naar het controleapparaat ; dat het bijgevolg noodzakelijk is de verordening dienovereenkomstig te wijzigen ;</sentence> 

airbag.WS-UEA.lst

/home/nobackup/SONAR/COMPACT/WR-U-E-A/WR-U-E-A0000075.data.ids.xml: <sentence>ja voor den airbag op te pompen eh :p</sentence> 
/home/nobackup/SONAR/COMPACT/WR-U-E-A/WR-U-E-A0000129.data.ids.xml: <sentence>Dobby , als ze valt heeft ze dan wel al ne airbag hee</sentence> 

我想實現的是Python的循環遍歷每個文件,隨後該文件中的每個並從中提取數據。舉例來說,我想要獲取每行的內容並提取<sentence></sentence>中的句子並將其放入df的列sentence。文件的每一行都會在數據幀中獲得自己的行。此外,我們還可以將正在讀取的當前文件的文件名添加到列filename(請參閱上面的最後一行代碼)。

一個重要後果是,在上面的例子中,數據幀將與filenameadapter.WR-P-P-F和兩個包括三排airbag.WS-U-E-A和所有具有不同sentence

預期輸出上面的例子:

fileName   | sentence 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
adapter.WR-P-P-F Een aanpassingseenheid (adapter) , aangebracht in een behuizing voornamelijk bestaande uit in- en uitvoereenheden , een koppeleenheid , een geheugeneenheid , een besturingseenheid (met actieve en passieve elementen en monolitische geïntegreerde schakelingen) en een elektrische voedingseenheid . &gt; 
adapter.WR-P-P-F Het toestel (adapter) draagt zorg voor de overbrenging van gegevens , met een snelheid van 10 Mbps (megabits per seconde) , tussen meerdere automatische gegevensverwerkende machines in een digitaal netwerk . 
adapter.WR-P-P-F Overwegende dat deze sensoren niet zijn ontworpen op de installatie van een gepantserde kabel ; dat de mogelijkheid moet worden geboden dat de gepantserde kabel niet verplicht wordt gesteld voor de aansluiting tussen de sensor en de adapter , maar alleen van de adapter naar het controleapparaat ; dat het bijgevolg noodzakelijk is de verordening dienovereenkomstig te wijzigen ; 
airbag.WS-U-E-A  ja voor den airbag op te pompen eh :p 
airbag.WS-U-E-A  Dobby , als ze valt heeft ze dan wel al ne airbag hee 

也許我的邏輯是關閉的,但我怎麼看它:循環文件和行並立即向df添加內容。但是,我不確定在Python中使用所有內容首先創建一個新列,然後將該內容附加到數據框是否更好?

回答

0

我發現一個解決方案後,大量的複製粘貼,但我不完全知道爲什麼這個工程。

for file in glob.glob(path+"\\*.lst"): 
    # If file is readable 
    if os.access(file, os.R_OK): 
     # Find lines inside files 
     lines = [line.rstrip("\n") for line in codecs.open(file,"r","utf-8")] 
     # For each line, do something 
     for line in lines: 
      base = os.path.basename(file)[:-4] 
      sentence = re.sub("<sentence>|</sentence>","",line) 

      df = df.append([dict(filename=base, sentence=sentence)]) 

如果我理解正確,你做的是,創建一個由密鑰文件名和關鍵句的辭典條目,然後補充說,我們需要的值。但我沒有得到的是,append如何知道如何解釋條目,即它如何知道它應該將條目與已存在的列名稱合併?