2016-07-14 15 views
1

次のデータを含む1つのテキストファイルを解析します。何列は、それが10または20または何かであり得る固定されていないこの入力テキストファイルでInput.txt-pandasを使用してテキストファイルのキー、バリューペアを読み取る方法は?

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 

。私はパンダを使ってこのファイルを解析したい。出力が含まれている必要があります

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 

私は結果のこのタイプを取得する方法についての任意の提案を output.txt-?

答えて

3

最初にread_csvのセパレータはデータに含まれていません。 ;、その後、stacksplitを倍増:コメントによって

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 

EDIT:

sをファイルに書き込めを使う必要がある場合:

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

コメントによってEDIT1:あなたは空の文字列に列名を設定し、(pandas0.18.0の新機能)rename_axisによってインデックス名を削除することができ

が、より一般的には、いくつかのテキストに列名を設定されている(例えば、 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

関連する問題