2012-10-15 6 views
7

저는 팬더를 처음 사용하고 있습니다. 이상한 형식의 파일을 DataFrame으로 읽으려고합니다. 내가와 동등하게 구조화 된 DataFrame 얻을 수 있었다팬더에서 효율적으로 줄을 확장하십시오. DataFrame

; No Time Date MoistAve MatTemp TDRConduct TDRAve DeltaCount tpAve Moist1 Moist2 Moist3 Moist4 TDR1 TDR2 TDR3 TDR4 
1 11:38:17 11.07.2012 11.37 48.20 5.15 88.87 15 344.50 11.84 11.35 11.59 15.25 89.0 89.0 89.0 88.0 
2 11:38:18 11.07.2012 11.44 48.20 5.13 88.88 2 346.22 12.08 11.83 -1.00 -1.00 89.0 89.0 -1.0 -1.0 
3 11:38:19 11.07.2012 11.10 48.20 4.96 89.00 3 337.84 11.83 11.59 10.62 -1.00 89.0 89.0 89.0 -1.0 
4 11:38:19 11.07.2012 11.82 48.20 5.54 88.60 3 355.92 11.10 13.54 12.32 -1.00 89.0 88.0 88.0 -1.0 

: 원본 파일은 다음과 같습니다

In [42]: date_spec = {'FetchTime': [1, 2]} 

In [43]: df = pd.read_csv('MeasureCK32450-20120711114050.mck', header=7, sep='\s\s+', 
          parse_dates=date_spec, na_values=['-1.0', '-1.00']) 

In [44]: df 
Out[52]: 
       FetchTime ; No MoistAve MatTemp TDRConduct TDRAve DeltaCount tpAve Moist1 Moist2 Moist3 Moist4 TDR1 TDR2 TDR3 TDR4 
0 2012-11-07 11:38:17  1  11.37  48.2  5.15 88.87   15 344.50 11.84 11.35 11.59 15.25 89 89 89 88 
1 2012-11-07 11:38:18  2  11.44  48.2  5.13 88.88   2 346.22 12.08 11.83  NaN  NaN 89 89 NaN NaN 
2 2012-11-07 11:38:19  3  11.10  48.2  4.96 89.00   3 337.84 11.83 11.59 10.62  NaN 89 89 89 NaN 
3 2012-11-07 11:38:19  4  11.82  48.2  5.54 88.60   3 355.92 11.10 13.54 12.32  NaN 89 88 88 NaN 

을하지만 지금은이 DataFrame

.... Moist1 Moist2 Moist3 Moist4 TDR1 TDR2 TDR3 TDR4 
1 .... 11.84 11.35 11.59 15.25 89 89 89 88 
2 .... 12.08 11.83  NaN  NaN 89 89 NaN NaN 

의 각 라인을 확장해야 네 개의 라인 (No, FetchTime, MeasureNo의 3 개의 인덱스) :

        .... Moist TDR 
No   FetchTime MeasureNo 
0 2012-11-07 11:38:17   1 .... 11.84 89 # from line 1, Moist1 and TDR1 
1        2 .... 11.35 89 # from line 1, Moist2 and TDR2 
2        3 .... 11.59 89 # from line 1, Moist3 and TDR3 
3        4 .... 15.25 88 # from line 1, Moist4 and TDR4 
4 2012-11-07 11:38:18   1 .... 12.08 89 # from line 2, Moist1 and TDR1 
5        2 .... 11.83 89 # from line 2, Moist2 and TDR2 
6        3 .... NaN NaN # from line 2, Moist3 and TDR3 
7        4 .... NaN NaN # from line 2, Moist4 and TDR4 

다른 항목을 유지하고 항목 순서를 유지하면서 MOST으로 유지해야합니다. I for row in df.iterrows(): ...으로 각 행을 반복 할 수 있다는 것을 알고 있지만 매우 빠르지 만 이 아닙니다. 내가 필요로하는 결과 DataFrame을 얻을 수있는 또 다른 방법이 있나요 ...

In [54]: data = [] 
In [55]: for d in range(1,5): 
....:  temp = df.ix[:, ['FetchTime', 'MoistAve', 'MatTemp', 'TDRConduct', 'TDRAve', 'DeltaCount', 'tpAve', 'Moist%d' % d, 'TDR%d' % d]] 
....:  temp.columns = ['FetchTime', 'MoistAve', 'MatTemp', 'TDRConduct', 'TDRAve', 'DeltaCount', 'tpAve', 'RawMoist', 'RawTDR'] 
....:  temp['MeasureNo'] = d 
....:  data.append(temp) 
....:  
In [56]: test = pd.concat(data, ignore_index=True) 
In [62]: test.head() 
Out[62]: 
      FetchTime MoistAve MatTemp TDRConduct TDRAve DeltaCount tpAve RawMoist RawTDR MeasureNo 
0 2012-11-07 11:38:17  11.37  48.2  5.15 88.87   15 344.50  11.84  89   1 
1 2012-11-07 11:38:18  11.44  48.2  5.13 88.88   2 346.22  12.08  89   1 
2 2012-11-07 11:38:19  11.10  48.2  4.96 89.00   3 337.84  11.83  89   1 
3 2012-11-07 11:38:19  11.82  48.2  5.54 88.60   3 355.92  11.10  89   1 
4 2012-11-07 11:38:20  12.61  48.2  5.87 88.38   3 375.72  12.80  89   1 

하지만 내가 필요로하는 순서를 얻을 수있는 연결에 영향을 미칠 수있는 방법을 볼 수 없습니다 : 내 첫 번째 방법이이었다?

+0

당신이 개 별도의 데이터 프레임을로드 할 수 있습니다 datetime에/groupby에 가입 하시겠습니까? – reptilicus

+0

또한보십시오 http://stackoverflow.com/questions/11795992/pandas-efficiently-splitting-entries –

답변

0

이 모든에서 시작 시험에서 네 번째 행을 제공합니다 제공 'i'를 : 당신이 실행 한 후 위와 같은 기본 루프를 사용

test.ix[i::4] 

, 그냥 3 0에서 시작하는 모든 규정 행 세트를 추가하여 위의 코드.

data = []  
for i in range(0,3:):  
    temp = test.ix[i::4] 
    data.append(temp) 
test2 = pd.concat(data,ignore_index=True) 

업데이트 : 내가 무엇을 당신이 원하는 것입니다 것은 모든 네 번째 행 그러나 모든 m 번째 행이 아니므로이 바로 위의 루프 제안이 될 것이라고 지금은 알고 있습니다. 죄송합니다.

업데이트 2 : 그렇지 않을 수도 있습니다. 연결은 원하는 순서를 반환하지 않더라도 원하는 결과에 고정 된 매핑을 반환한다는 사실을 활용할 수 있습니다. d는 시간 소인 당 행 수이고, m은 시간 소인 수입니다.

다음과 같이 테스트 행이 표시되는 것 같습니다. [0, m, 2m, 3m, 1, m + 1,2m + 1,3m + 1,2, m + 2,2m + 2,3m +2, ..., m-1,2m-1,3m-1,4m-1]

색인의 목록을 생성하는 방법은 훨씬 좋을 것이라고 확신하지만, 저에게 도움이되었습니다.

d = 4 
m = 10 
small = (np.arange(0,m).reshape(m,1).repeat(d,1).T.reshape(-1,1)) 
shifter = (np.arange(0,d).repeat(m).reshape(-1,1).T * m) 
NewIndex = (shifter.reshape(d,-1) + small.reshape(d,-1)).T.reshape(-1,1) 
NewIndex = NewIndex.reshape(-1) 
test = test.ix[NewIndex] 
+0

일할지도 모른다 pd.stack와 pd.merge를 포함하는 다른 접근이있다. 시간 필드에 따라 다릅니다. 데이터의 필드를 볼 때 행 3과 행 4는 같은 시간과 요일 스탬프를가집니다. 이것은 포맷팅이나 데이터가 기록되는 정밀도의 결과인가요? 출력을 표시 할 때 다음과 같이 표시합니다. – BKay

+0

형식이 맞고 시간이 모든 항목이 고유 한 정밀도로 기록 된 경우 스택 및 병합 해. 알려 주시면 코드를 게시 해 드리겠습니다. – BKay

1

여기에는 누적 값을 생성하기위한 numpy의 반복 및 배열 인덱싱을 기반으로 한 솔루션이 있으며 pandas의 병합으로 연결된 결과가 출력됩니다.

먼저 데이터 샘플을 DataFrame에로드하십시오 (약간 변경된 read_csv의 인수).

from cStringIO import StringIO 

data = """; No Time Date MoistAve MatTemp TDRConduct TDRAve DeltaCount tpAve Moist1 Moist2 Moist3 Moist4 TDR1 TDR2 TDR3 TDR4 
1 11:38:17 11.07.2012 11.37 48.20 5.15 88.87 15 344.50 11.84 11.35 11.59 15.25 89.0 89.0 89.0 88.0 
2 11:38:18 11.07.2012 11.44 48.20 5.13 88.88 2 346.22 12.08 11.83 -1.00 -1.00 89.0 89.0 -1.0 -1.0 
3 11:38:19 11.07.2012 11.10 48.20 4.96 89.00 3 337.84 11.83 11.59 10.62 -1.00 89.0 89.0 89.0 -1.0 
4 11:38:19 11.07.2012 11.82 48.20 5.54 88.60 3 355.92 11.10 13.54 12.32 -1.00 89.0 88.0 88.0 -1.0 
""" 

date_spec = {'FetchTime': [1, 2]} 
df = pd.read_csv(StringIO(data), header=0, sep='\s\s+',parse_dates=date_spec, na_values=['-1.0', '-1.00']) 

그런 TDRs의 드 스택 벡터를 구축하고 원하는 출력으로 원래의 데이터 프레임

stacked_col_names = ['TDR1','TDR2','TDR3','TDR4'] 

repeated_row_indexes = np.repeat(np.arange(df.shape[0]),4) 
repeated_col_indexes = [np.where(df.columns == c)[0][0] for c in stacked_col_names] 

destacked_tdrs = pd.DataFrame(data=df.values[repeated_row_indexes,repeated_col_indexes],index=df.index[repeated_row_indexes],columns=['TDR']) 

ouput = pd.merge(left_index = True, right_index = True, left = df, right = destacked_tdrs) 

와 병합 :

output.ix[:,['TDR1','TDR2','TDR3','TDR4','TDR']] 

    TDR1 TDR2 TDR3 TDR4 TDR 
0 89 89 89 88 89 
0 89 89 89 88 89 
0 89 89 89 88 89 
0 89 89 89 88 88 
1 89 89 NaN NaN 89 
1 89 89 NaN NaN 89 
1 89 89 NaN NaN NaN 
1 89 89 NaN NaN NaN 
2 89 89 89 NaN 89 
2 89 89 89 NaN 89 
2 89 89 89 NaN 89 
2 89 89 89 NaN NaN 
3 89 88 88 NaN 89 
3 89 88 88 NaN 88 
3 89 88 88 NaN 88 
3 89 88 88 NaN NaN 
관련 문제