2017-03-18 63 views
5

Moja ramka danych pandy składa się z kolumny kategorycznej JOB_TITLE, kolumny liczbowej BASE_SALARY i indeksu datetime JOIN_DATE. Chciałbym przeprowadzić agregację nad grupami kategorycznych i downsamplingiem datetimes następująco:Jednoczesne działanie grupy i ponowne próbkowanie na ramce danych pandy?

# Resampled at frequency of start data of every 5 years 
mean_agg = (df 
      .groupby('JOB_TITLE') 
      .resample('5AS')['BASE_SALARY'] 
      .mean()) 

Niestety, operacja GroupBy występuje przed resample, operacja jest wykonywana resample niezależnie dla każdej grupy JOB_TITLE. Wynika to w następujących seriach:

| JOB_TITLE   | JOIN_DATE |  | 
|-------------------|------------|-------| 
| Data Scientist | 2004-01-01 | 60000 | 
|     | 2009-01-01 | 75000 | 
|     | 2014-01-01 | 90000 | 
|     |   |  | 
| Software Engineer | 2001-01-01 | 70000 | 
|     | 2006-01-01 | 85000 | 
|     | 2011-01-01 | 90000 | 
|     | 2016-01-01 | 85000 | 

Jak widać indeksy na poziomie JOIN_DATE dla grupy danych naukowiec i inżynier oprogramowania nie są wyrównane. Stwarza to problem przy ubieganiu rozebranie stosu dla poziomu JOB_TITLE następująco:

mean_agg.unstack('JOB_TITLE') 

Skutkuje to w następujący dataframe:

| JOB_TITLE | Data Scientist | Software Engineer | 
|------------|----------------|-------------------| 
| JOIN_DATE |    |     | 
| 2001-01-01 | NaN   | 70000    | 
| 2004-01-01 | 60000   | NaN    | 
| 2006-01-01 | NaN   | 85000    | 
| 2009-01-01 | 75000   | NaN    | 
| 2011-01-01 | NaN   | 70000    | 
| 2014-01-01 | 90000   | NaN    | 
| 2016-01-01 | NaN   | 85000    | 

Jak mogę uniknąć tego sekwencyjne działanie GroupBy i resample i zamiast wykonywać jednoczesna operacja? Dzięki!

Odpowiedz

3

Aktualizacja Pandy 0.21 odpowiedź: pd.TimeGrouper is getting deprecated, zamiast tego użyj pd.Grouper.

mean_agg = (df.groupby(['JOB_TITLE',pd.Grouper(freq='5AS')])['BASE_SALARY'] 
       .mean()) 

mean_agg.unstack('JOB_TITLE') 

Zamiast resample, spróbujmy użyć pd.TimeGrouper

mean_agg = (df 
     .groupby(['JOB_TITLE',pd.TimeGrouper(freq='5AS')])['BASE_SALARY'] 
     .mean()) 

mean_agg.unstack('JOB_TITLE') 

TimeGrouper wyrównuje pojemniki zgrupowane przedziale czasowym.

+0

Świetnie! 'pd.TimeGrouper()' jest idealny dla mojego problemu. –