2017-09-15 52 views
0

我試圖找出一種方法來導入一個.txt文件,理想地使用python 3.5作爲數據框(pandas)。我用不同的數據做了幾次。這個文件有幾千例/實例,這需要每13線之後是一個空行:每個實例使用python導入多個行的txt文件

Cat1: text 
… 
Cat13: text 

Cat1: text 
… 
Cat13: text … 

使用下面的代碼,我可以訪問每一行,並創建一個新的載體每個實例(不幸的列向量而不是行向量,它可以被添加到一個新的數據幀):

import codecs 
import pandas as pd 
with codecs.open(‚file.txt', 'r',encoding='utf-8', errors='ignore') as f: 
    lines = f.readlines() 

L = list(lines[i] for i in range(14)) 
se = pd.Series(L[:13]) 
df = pd.DataFrame([], columns=('Cat1’,…,’Cat13‘)) 
df['new_row'] = se.values 

我正在尋找一個基本的數據幀(實例×13),以「CAT1」,...,「Cat13」爲列,實例作爲行。

Cat1 Cat2 ... Cat13 
text text  text 
text text  text 
... 

有沒有一個簡單的解決這個問題,甚至是另一個包加載這樣的文件?

編輯: 不是很確定我在找什麼。最後能夠使用this thread中提到的itertools.groupby來解決這個問題。

import itertools 
import codecs 
import pandas as pd 

def group_separator(line): 
    return line=='\n' 

with codecs.open('file.txt', 'r',encoding='utf-8', errors='ignore') as f: 
    lines = f.readlines() 

cols = ('Cat1',...,'Cat13') 
data = [] 
for (key, group) in itertools.groupby(lines, group_separator): 
    if key: 
     next(group).strip() 
    else: 
     tem_data = [i.strip() for i in group] 
     tem_data = filter(lambda l: l != '', tem_data) 
     tem_data = [i.split(':',1) for i in tem_data] 
     tem_data = [i[1].strip() for i in tem_data] 
     if len(tem_data) == 13: 
      data.append(tem_data) 

df = pd.DataFrame(data, columns=cols) 
+2

能否請您編輯示例數據顯示出一些完整的情況和預期的輸出? – zipa

+0

而且更加地道。 – GiantsLoveDeathMetal

+0

@tsc檢查我的答案 – MedAli

回答

0

給出的輸入文件的格式如下:

Cat1/instance1: text … 
Cat13/instance1: text 

Cat1/instance2: text … 
Cat13/instance2: text … 

可以讀取文件作爲一列數據幀如下(PS:大熊貓會自動跳過空行):

In [70]: df = pd.read_csv('/tmp/test.txt', header=None) 

In [71]: df 
Out[71]: 
         0 
0 Cat1/instance1: text … 
1 Cat13/instance1: text 
2 Cat1/instance2: text … 
3 Cat13/instance2: text … 

In [72]: 

根據/:拆分這些行以構造具有三列的新數據幀:

In [72]: dff = pd.DataFrame(df[0].str.strip().str.split('/|: ').tolist()) 

In [73]: dff 
Out[73]: 
     0   1  2 
0 Cat1 instance1 text … 
1 Cat13 instance1 text 
2 Cat1 instance2 text … 
3 Cat13 instance2 text … 

In [74]: 

然後設置在前兩列[0, 1],作爲索引dff,拆散隨着指數的第一級數據幀,使cat1..cat13作爲新列。然後reset_index刪除instance1.. instance2有一行:

In [74]: dff = dff.set_index([0,1]).unstack(level=0).reset_index(drop=True) 

In [75]: dff 
Out[75]: 
     2   
0 Cat1 Cat13 
0 text … text 
1 text … text … 

In [76]: 

最後,我們需要刪除uncessary水平列,只保留cat1... cat13

In [76]: dff.columns = dff.columns.levels[1].tolist() 

In [77]: dff 
Out[77]: 
    Cat1 Cat13 
0 text … text 
1 text … text … 

In [78]: 

沒有說明上述情況,總體代碼如下所示:

df = pd.read_csv('/tmp/test.txt', header=None) 
dff = pd.DataFrame(df[0].str.strip().str.split('/|: ').tolist()) 
dff = dff.set_index([0,1]).unstack(level=0).reset_index(drop=True) 
dff.columns = dff.columns.levels[1].tolist() 

如果你想處理編碼utf-8,讀取文件內容如下:

df = pd.read_csv('/tmp/test.txt', header=None, encoding='utf-8') 
+0

Thx爲您的答覆!我設法通過以下方式加載數據:import codecs file = codecs.open('file.txt','rU','UTF-8',errors ='ignore') df = pd.read_csv(file,header =無,sep ='\ n')。使用你的代碼分割數據,我得到了2列cat1 ..cat13和「文字」。有關如何彙總數據的任何輸入? – tsc

+0

@tsc你是什麼意思彙總數據?你能給個例子嗎?此外,如果我的答案足以解決您的初步問題,請考慮接受並可能投票;) – MedAli

相關問題