2014-10-02 17 views
5

Bir zaman damgası dizinine sahip bir panda veri karesini saat başına bir örneğe yeniden örneklemeye çalışıyorum. String değerleri ile bir sütun için en sık değeri elde etmek istiyorum. Bununla birlikte, zaman dizisi yeniden örneklemenin yerleşik işlevleri, yeniden örneklemenin varsayılan yöntemlerinden biri olarak modu içermez ('anlamına gelir' ve 'saymak').
Kendi işlevimi tanımlamayı ve bu işlevi iletmeyi denedim, ancak çalışmıyor. Ayrıca np.bincount işlevini kullanmayı denedim, ancak dizelerle çalıştığım için çalışmaz.Pandalarla yeniden örnekleme yaparken dize değişkeni modu nasıl elde edilir

    station_arrived action  lat1  lon1 
date_removed 
2012-01-01 13:12:00  56    A  19.4171 -99.16561 
2012-01-01 13:12:00  56    A  19.4271 -99.16361 
2012-01-01 15:41:00  56    A  19.4171 -99.16561 
2012-01-02 08:41:00  56    C  19.4271 -99.16561 
2012-01-02 11:36:00  56    C  19.2171 -99.16561 

Bu benim kod şimdiye kadar geçerli:: dict

Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
    File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\generic.py", line 2836, in resample 
    return sampler.resample(self).__finalize__(self) 
    File "C:\Program Files\Anaconda\lib\site-packages\pandas\tseries\resample.py", line 83, in resample 
    rs = self._resample_timestamps() 
    File "C:\Program Files\Anaconda\lib\site-packages\pandas\tseries\resample.py", line 277, in _resample_timestamps 
    result = grouped.aggregate(self._agg_method) 
    File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 2404, in aggregate 
    result[col] = colg.aggregate(agg_how) 
    File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 2076, in aggregate 
    ret = self._aggregate_multiple_funcs(func_or_funcs) 
    File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 2125, in _aggregate_multiple_funcs 
    results[name] = self.aggregate(func) 
    File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 2073, in aggregate 
    return getattr(self, func_or_funcs)(*args, **kwargs) 
    File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 486, in __getattr__ 
    (type(self).__name__, attr)) 
AttributeError: 'SeriesGroupBy' object has no attribute 'A ' 

cevap

4

değerler: Aşağıdaki hatayı bakın

def mode1(algo): 
    common=[ite for ite, it in Counter(algo).most_common(1)] 
    # Returns all unique items and their counts 
    return common 

hourlycount2 = travels2012.resample('H', how={'station_arrived': 'count', 
               'action': mode(travels2012['action']), 
               'lat1':'count', 'lon1':'count'}) 

hourlycount2.head() 

İşte

verilerim böyle görünüyor her gruba iletilen işlevleri (örneğin 'sayım'/'toplam'/'maks') veya işlevleri temsil eden dizeler olmak zorundadır. Geçirdiğiniz, sonucu (değer) mode(travels2012['action']) sonucudur. belki

In [11]: df.resample('H', how={'station_arrived':'count', 
           'action': lambda x: mode(df['action']), 
           'lat1':'count', 'lon1':'count'}) 
Out[11]: 
        action station_arrived lon1 lat1 
date_removed 
2012-01-01 13:00:00 [A]    2  2  2 
2012-01-01 14:00:00 [A]    0  0  0 
2012-01-01 15:00:00 [A]    1  1  1 
2012-01-01 16:00:00 [A]    0  0  0 
... 

bu (o tüm sütuna uyguluyor gibi) istediğini olduğundan emin değilim:

Yani bunun her bir gruba uygulanan bir işlev, yapmak gerekir

In [12]: df.resample('H', how={'station_arrived':'count', 
           'action': mode, 'lat1':'count', 'lon1':'count'}) 
Out[12]: 
        action station_arrived lon1 lat1 
date_removed 
2012-01-01 13:00:00 [A]    2  2  2 
2012-01-01 14:00:00  []    0  0  0 
2012-01-01 15:00:00 [A]    1  1  1 
2012-01-01 16:00:00  []    0  0  0 
... 

Ben liste halinde yerine ona daha gerçek değerini (A) 'görmeyi tercih ediyorum, ve oldukça [] daha NaN: her grup için modu almak istiyorum.


Ben her zaman (beraberlik olabilir gibi) Serisi döner ve hiçbir değer kereden fazla görünüp görünmediğini boş uyarısını dikkate almak gerekmektedir Serisi modu yöntemi, kayda değer olduğunu düşünüyorum.
aşağıdaki gibi etrafına sarın olabilir (ve benzer senin mod fonksiyonu sarabilirsiniz):

def mode_(s): 
    try: 
     return s.mode()[0] 
    except IndexError: 
     return np.nan 

In [22]: df.resample('H', how={'station_arrived':'count', 
           'action': mode_, 'lat1':'count', 'lon1':'count'}) 
Out[22]: 
        action station_arrived lon1 lat1 
date_removed 
2012-01-01 13:00:00  A    2  2  2 
2012-01-01 14:00:00 NaN    0  0  0 
2012-01-01 15:00:00 NaN    1  1  1 
2012-01-01 16:00:00 NaN    0  0  0 
... 
+0

sayesinde ikinci seçeneği, her bir grup için modu hesaplamak için tanımlı fonksiyon kullanıyor aradığım sadece ne. Bu komik, daha önce benzer bir çözüm denedim ama nedense işe yaramadı. – asado23

İlgili konular