2014-10-02 5 views
5

Sto provando a ricampionare un frame di dati panda con un indice di data/ora a un evento orario. Sono interessato ad ottenere il valore più frequente per una colonna con valori stringa. Tuttavia, le funzioni incorporate del ricampionamento delle serie temporali non includono la modalità come uno dei metodi predefiniti per ricampionare (come "significa" e "conta").
Ho cercato di definire la mia funzione e di passare quella funzione ma non funziona. Ho anche provato a utilizzare la funzione np.bincount ma non funziona poiché sto lavorando con le stringhe.Come ottenere la modalità per variabile stringa durante il ricampionamento con i panda

Ecco come miei dati appare:

    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 

Questo è il mio codice finora:

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() 

vedo il seguente errore:

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 ' 

risposta

4

I valori della dict devono essere stringhe che rappresentano funzioni (es. 'count'/'sum'/'max') o funzioni che vengono passate a ciascun gruppo. Quello che stai passando è il risultato (il valore) mode(travels2012['action']).

Quindi è necessario per rendere questa una funzione, che viene applicato a ciascun gruppo:

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

Non sono sicuro che questo è ciò che si vuole (come si sta applicando a tutta la colonna), forse si vuole prendere la modalità per ogni gruppo:

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

preferirei vedere il valore reale (a), piuttosto che in una lista, e NaN invece di [].


penso che vale la pena menzionare il metodo modalità Series, che ha l'avvertenza che essa sempre restituisce una serie (come ci può essere un pareggio) ed è vuota se nessun valore appare più di una volta.
Si potrebbe avvolgere intorno ad esso come segue (e si può allo stesso modo avvolgere la funzione della modalità):

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

Grazie la seconda opzione, utilizzando la funzione definita per calcolare la modalità per ogni gruppo, è proprio quello che stavo cercando. È divertente, ho provato una soluzione simile prima ma per qualche motivo non ha funzionato. – asado23