2013-11-29 2 views
2

더 많은 분석을 수행 할 수 있도록 간단한 스크립트를 작성하여 포트란 코드의 CSV 출력 파일을 팬더 DataFrame 개체로 변환하려고합니다. csv에는 두 개의 열이 있지만 모양이 [n, 2] 인 데이터의 여러 추가 블록으로 구성됩니다 (각 샘플 이름의 형식은 RN_x입니다). 지금까지 다음 코드가 있지만 결과 DataFrame 개체는 분석을 허용하지 않습니다. 아래 샘플 파일 (원본에서 많이 줄임)을 첨부했습니다. 덧붙여서 데이터 파일의 첫 번째 열은 날짜를 의미하지만 출력은 si = imulation의 하루에 해당하는 숫자입니다. 모든 조언을 많이 주시면 감사하겠습니다.numpy 또는 pandas를 사용하여 긴 형식의 CSV 파일 조작

import numpy as np 
import pandas as pd 
import csv as csv 
readdata = csv.reader(open('C:/data/Test.csv', 'r')) 
data = [] 
for row in readdata: 
    data.append(row) 
a = np.array(data).reshape(11,-1, order = 'F') 
col = a[0,:4].reshape(4) 
row = pd.Index(a[4:,0:1].reshape(7)) 
b = a[4:,5:] 
df = pd.DataFrame(b, index = row, columns = col) 

샘플 :

RN_48865, 
1,Observed 
1,0 
259,Computed 
1,0.000014 
91,0.000014 
182,0.000014 
274,0.000014 
366,0.000014 
457,0.000014 
548,0.000014 
RN_7445, 
1,Observed 
1,0 
259,Computed 
1,0.000013 
91,0.000013 
182,0.000013 
274,0.000013 
366,0.000013 
457,0.000013 
548,0.000013 
RN_9288, 
1,Observed 
1,0 
259,Computed 
1,0.000011 
91,0.000011 
182,0.000011 
274,0.000011 
366,0.000011 
457,0.000011 
548,0.000011 
RN_10955, 
1,Observed 
1,0 
259,Computed 
1,0.000014 
91,0.000014 
182,0.000014 
274,0.000014 
366,0.000014 
457,0.000014 
548,0.000014 

샘플 출력 :

Index,RN_48865,RN_7445,RN_9288,RN_10955 
1,0.000014,0.000013,0.000011,0.000014 
91,0.000014,0.000013,0.000011,0.000014 
182,0.000014,0.000013,0.000011,0.000014 
274,0.000014,0.000013,0.000011,0.000014 
366,0.000014,0.000013,0.000011,0.000014 
457,0.000014,0.000013,0.000011,0.000014 
548,0.000014,0.000013,0.000011,0.000014 
+0

그래서 질문은 무엇인가? – cyborg

+0

죄송합니다. 명확하지 않았습니다. 긴 파일을 인덱스 (기본 날짜에 숫자를 추가 한 구문 분석 된 날짜, 예를 들어 1995-1-1; 첫 번째 데이터 열)와 함께 두 번째 열의 데이터로 채워진 여러 열로 Dataframe 개체로 변환하려면 어떻게해야합니까? "RN_x"레이블을 열 레이블로 사용하십시오. 원래의 긴 파일에는 합계의 다른 '위치'에 출력을 나타내는 데이터 블록이 반복되어 있습니다. 각 위치에 대한 통계를 분석 할 수 있기를 원합니다. – user2989613

+0

"RN_x"레이블을 열 레이블로 사용하여 두 번째 열의 데이터로 채워지는 "여러 열"을 이해하지 못합니다. " 왜 단순히 데이터를 표시하지 않는가? (\ n's)? – cyborg

답변

1

당신은 실제로 몇 가지 질문을 요구하고있다. 이것은 내가 원하는 출력에서 ​​이해할 수있는 것입니다 :

source="""RN_48865, 
    1,Observed 
    1,0 
    259,Computed 
    1,0.000014 
    91,0.000014 
    182,0.000014 
    274,0.000014 
    366,0.000014 
    457,0.000014 
    548,0.000014 
    RN_7445, 
    1,Observed 
    1,0 
    259,Computed 
    1,0.000013 
    91,0.000013 
    182,0.000013 
    274,0.000013 
    366,0.000013 
    457,0.000013 
    548,0.000013 
    RN_9288, 
    1,Observed 
    1,0 
    259,Computed 
    1,0.000011 
    91,0.000011 
    182,0.000011 
    274,0.000011 
    366,0.000011 
    457,0.000011 
    548,0.000011 
    RN_10955, 
    1,Observed 
    1,0 
    259,Computed 
    1,0.000014 
    91,0.000014 
    182,0.000014 
    274,0.000014 
    366,0.000014 
    457,0.000014 
    548,0.000014 
""" 
import pandas as pd 
import numpy as np 
import StringIO 
df = pd.read_csv(StringIO.StringIO(source), header=None) 
rns = np.where(df[0].apply(lambda x: x.lstrip().startswith('RN_')))[0] 
length = rns[1] - rns[0] 
index = df[0].iloc[4:length] 
cols = df[0][::length].apply(lambda x: x.lstrip()).values 
result_df = pd.DataFrame(index=index) 
for col_num, col_start in enumerate(range(0, len(df), length)): 
    result_df[cols[col_num]] = df[1][col_num*length+4 : (col_num+1)*length].values 
print result_df 

출력 : 날짜

 RN_48865 RN_7445 RN_9288 RN_10955 
1 0.000014 0.000013 0.000011 0.000014 
91 0.000014 0.000013 0.000011 0.000014 
182 0.000014 0.000013 0.000011 0.000014 
274 0.000014 0.000013 0.000011 0.000014 
366 0.000014 0.000013 0.000011 0.000014 
457 0.000014 0.000013 0.000011 0.000014 
548 0.000014 0.000013 0.000011 0.000014 

사용 :

pandas.read_csv('file', 
    parse_date=0, # 0th column 
    date_parser=lambda x: pandas.Timestamp('1995-1-1')+timedelta(x)) 
+0

하나의 요소 덕분에 도움이되었습니다. 사용자 사이보그는 내가 동의하는 질문이 분명하지 않다고 지적했다. – user2989613

+0

그게 전부예요. 매우 감사합니다. 내가 거기 잘못된 길을 가고있는 것 같습니다. 아직도 배울 것이 많다. – user2989613

관련 문제