2016-07-14 4 views
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 

편집 : 필요 쓰기는 s을 제기 할 경우

, 012,356,107,717,193를 사용: 코멘트에 의해

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

EDIT1 :

당신은 빈 문자열로 열 이름을 설정하고 ( pandas 0.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

Dang! 당신은 나를 다시 이길 ;-) +1 – piRSquared

+0

@ jezrael- 괜찮아요.하지만 출력 위에 출력되는 1과 0은 원하지 않습니다. 우리가 이것을 위해 무엇을 할 수 있습니까? 대답을 편집하고 몇 가지 최상위 수준의 설명을 제공하십시오. – kit

+0

@kit 당신은 코드 작성 서비스가 아닙니다. – shivsn

관련 문제