2017-03-18 33 views
5

Khung dữ liệu gấu trúc của tôi bao gồm cột phân loại JOB_TITLE, cột số BASE_SALARY và chỉ mục datetime JOIN_DATE. Tôi muốn thực hiện một tập hợp trong nhóm của datetimes phân loại và downsampled như sau:Hoạt động đồng thời của groupby và resample trên khung dữ liệu gấu trúc?

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

Thật không may, như hoạt động groupby đang xảy ra trước khi đổi mẫu, các hoạt động được thực hiện một cách độc lập resample đối với từng nhóm JOB_TITLE. Kết quả này theo sau Series:

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

Như bạn có thể thấy chỉ mục ở cấp JOIN_DATE cho nhóm Data Scientist và Kỹ sư phần mềm không được căn chỉnh. Điều này tạo ra một vấn đề khi bạn áp dụng unstack cho cấp JOB_TITLE như sau:

mean_agg.unstack('JOB_TITLE') 

Điều này dẫn đến dataframe sau:

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

Làm thế nào tôi có thể tránh hoạt động tuần tự này groupby và resample và thay vào đó thực hiện một hoạt động đồng thời? Cảm ơn!

Trả lời

3

Cập nhật Pandas 0,21 trả lời: pd.TimeGrouper is getting deprecated, sử dụng pd.Grouper thay thế.

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

mean_agg.unstack('JOB_TITLE') 

Thay vì sử dụng resample, chúng ta hãy cố gắng sử dụng pd.TimeGrouper

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

mean_agg.unstack('JOB_TITLE') 

TimeGrouper gắn các thùng của phạm vi thời gian nhóm.

+0

Tuyệt vời! 'pd.TimeGrouper()' là hoàn hảo cho vấn đề của tôi. –

Các vấn đề liên quan