2016-07-14 44 views
1

我想解析一個包含以下數據的文本文件。如何閱讀使用熊貓的文本文件的鍵,值對?

Input.txt-

1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a 
4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k 
6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d 

在該輸入文本文件沒有列被固定它可以是10或20或任何東西。我想用熊貓來解析這個文件。輸出應該包含:

output.txt-

index[0] 
1  88 
11 1438 
15 kkk 
45 7.7 
45 00 
21 66 
86 a 

index[1] 
4  13 
4  1388 
49 DDD 
8  157.73 
67 00 
45 08 
84 b 
45 k 

我如何能得到這個類型的結果有什麼建議?

回答

3

您可以首先用read_csv帶有不在數據中的分隔符例如;,然後用stack一倍split

import pandas as pd 
import numpy as np 
import io 

temp=u"""1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a 
4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k 
6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d 
""" 
#after testing replace io.StringIO(temp) to filename 
df = pd.read_csv(io.StringIO(temp), sep=";", index_col=None, names=['text']) 

print (df) 
               text 
0  1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a 
1 4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k 
2   6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d 
s = df.text.str.split('|', expand=True).stack().str.split('=', expand=True) 
print (s) 
     0  1 
0 0 1  88 
    1 11 1438 
    2 15  KKK 
    3 45  7.7 
    4 45  00 
    5 21  66 
    6 86  a 
1 0 4  13 
    1 4 1388 
    2 49  DDD 
    3 8 157.73 
    4 67  00 
    5 45  08 
    6 84  b 
    7 45  k 
2 0 6  84 
    1 41  18 
    2 56  TTT 
    3 67  1.2 
    4 4  21 
    5 45  78 
    6 07  d 
dfs = [g.set_index(0).rename_axis(None) for i, g in s.groupby(level=0)] 
print (dfs[0]) 
     1 
1  88 
11 1438 
15 KKK 
45 7.7 
45 00 
21 66 
86  a 
for i, g in s.groupby(level=0): 
    print (g.set_index(0).rename_axis(None)) 
     1 
1  88 
11 1438 
15 KKK 
45 7.7 
45 00 
21 66 
86  a 
     1 
4  13 
4  1388 
49  DDD 
8 157.73 
67  00 
45  08 
84  b 
45  k 
     1 
6 84 
41 18 
56 TTT 
67 1.2 
4 21 
45 78 
07 d 

的評論編輯:

如果需要寫入文件s,使用to_csv:通過評論

s.to_csv('file.txt', header=None, index=None, sep='\t') 

EDIT1:

您可以設置列名空字符串和rename_axis(新中pandas0.18.0)刪除索引名,但更常見的是設置列名的一些文字(例如: s.columns = ['idx','a']):

s = df.text.str.split('|', expand=True).stack().str.split('=', expand=True) 
s.columns = ['idx',''] 
print (s) 
    idx   
0 0 1  88 
    1 11 1438 
    2 15  KKK 
    3 45  7.7 
    4 45  00 
    5 21  66 
    6 86  a 
1 0 4  13 
    1 4 1388 
    2 49  DDD 
    3 8 157.73 
    4 67  00 
    5 45  08 
    6 84  b 
    7 45  k 
2 0 6  84 
    1 41  18 
    2 56  TTT 
    3 67  1.2 
    4 4  21 
    5 45  78 
    6 07  d 
dfs = [g.set_index('idx').rename_axis(None) for i, g in s.groupby(level=0)] 
print (dfs[0]) 
1  88 
11 1438 
15 KKK 
45 7.7 
45 00 
21 66 
86  a 
+0

黨!你再次擊敗我;-) +1 – piRSquared

+0

@ jezrael-一切都很好,但我不希望這1和0打印輸出上面。我們可以爲此做些什麼?編輯答案並提供一些頂級解釋。 – kit

+0

@kit你應該自己做這不是一個代碼寫作服務。 – shivsn