2012-10-15 12 views
7

Pandalar konusunda yeni bir bilgim var ve garip biçimlendirilmiş bir dosyayı DataFrame'e okumaya çalışıyorum. Birlikte aynı derecede yapılandırılmış DataFrame başardıPandalardan gelen çizgileri verimli bir şekilde genişletin 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 

: orijinal dosya şuna benzer

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 

Ama şimdi bu 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 

her satırı genişletmek zorunda dört satıra (üç endeksle No, FetchTime ve MeasureNo):

        .... 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 

, diğer sütunları koruyarak ve MOST girişlerinin sırasını koruyarak önemli. Ben biliyorum her satırda for row in df.iterrows(): ... ile yineleyebilir, ancak bu çok hızlı değil olduğunu okudum. ihtiyacım çıkan DataFrame almak için başka bir yolu var mı ...

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 

Ama gerek sırasını almak için birleştirme etkilemek için bir yol görmüyorum: İlk yaklaşım bu?

+0

Eğer 2 ayrı veri çerçeveleri yük edebilir ve datetime'a katılmak/groupby yapmak? – reptilicus

+0

Ayrıca bkz http://stackoverflow.com/questions/11795992/pandas-efficient-splitting-entries –

cevap

0

Bu, her başlayarak testte dördüncü satır verir verir 'i': Eğer çalıştırdıktan sonra yukarıdaki gibi aynı temel spiral kullanarak

test.ix[i::4] 

, sadece 0 ile 3 başlayan her ileri sıranın kümesi ekler senin Yukarıdaki kod.

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

Güncelleme: Ben de buydu istediğimiz her dördüncü satır ama her zaman istendi satır değil, bu yüzden bu sadece yukarıdaki döngü önerileri olacağını artık biliyoruz. Afedersiniz.

Güncelleştirme 2: Belki de değil. Birleştirilmiş olmama sırasını iade etmese de, geri dönüşü ne istediğinizi döndürmek istendiğinde, ne yapmak istediğinize ilişkin sabit bir haritalama olduğu gerçeğinden faydalanabiliriz. d, zaman damgası başına satır sayısıdır ve m, zaman damgası sayısıdır.

Satırların aşağıdaki gibi test edilmesini istiyorsunuz: [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]

Endekslerin bu listesini oluşturmanın daha güzel yolları olduğuna eminim, fakat bu benim için çalıştı

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

Çalışabilecek pd.stack ve pd.merge içeren başka bir yaklaşım var. Zaman alanlarına göre değişir. Verilerinizdeki alanları gördüğümde, satır 3 ve 4'ün aynı zaman ve gün damgası var. Bu, verilerin kaydedildiği hassas veya biçimlendirilmiş bir üründür. Çıktısını gösterdiğinizde şunu soruyorum: – BKay

+0

Sadece biçimlendirme yapıyorsa ve zaman tüm kayıtların benzersiz olduğunu doğru bir şekilde kaydediyorsa, yığınla birleştirin yap. Bana haber ver ve bazı kodları yayınlayacağım. – BKay

1

Yığınlanmış değerler oluşturmak için numpy'nin yineleme ve dizi indekslemesine dayalı bir çözüm ve pandaların birleştirilen sonucu elde etmek için birleştirmesi.

Verilerinizi bir örnek bir DataFrame'e (biraz değiştirilen read_csv argümanları) yükleyin.

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']) 

sonra TDRs bir de-yığılmış vektörü inşa etmek ve arzu edilen çıkış ile, orijinal veri çerçevesi

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) 

ile birleştirme:

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 
İlgili konular