2017-02-09 31 views
8

Đây là những gì dataframe của tôi trông giống như:Pandas TimeGrouper và Pivot?

Timestamp    CAT 
0 2016-12-02 23:35:28  200 
1 2016-12-02 23:37:43  200 
2 2016-12-02 23:40:49  300 
3 2016-12-02 23:58:53  400 
4 2016-12-02 23:59:02  300 
... 

Đây là những gì tôi đang cố gắng để làm trong Pandas (chú ý timestamps được nhóm):

Timestamp BINS   200 300 400 500 
2016-12-02 23:30   2  0  0  0 
2016-12-02 23:40   0  1  0  0 
2016-12-02 23:50   0  1  1  0 
... 

Tôi đang cố gắng để tạo ra thùng khoảng thời gian 10 phút để tôi có thể tạo biểu đồ thanh. Và có các cột như giá trị CAT, vì vậy tôi có thể đếm số lần mỗi CAT xuất hiện trong thùng thời gian đó.

Những gì tôi có cho đến nay có thể tạo ra các thùng thời gian:

def create_hist(df, timestamp, freq, fontsize, outfile): 
    """ Create a histogram of the number of CATs per time period.""" 

    df.set_index(timestamp,drop=False,inplace=True) 
    to_plot = df[timestamp].groupby(pandas.TimeGrouper(freq=freq)).count() 
    ... 

Nhưng vấn đề của tôi là tôi không thể cho cuộc đời của tôi tìm ra cách để nhóm bởi cả những con mèo và thùng thời gian. thử mới nhất của tôi là sử dụng df.pivot(columns="CAT") trước khi thực hiện groupby nhưng nó chỉ mang lại cho tôi lỗi:

def create_hist(df, timestamp, freq, fontsize, outfile): 
    """ Create a histogram of the number of CATs per time period.""" 

    df.pivot(columns="CAT") 
    df.set_index(timestamp,drop=False,inplace=True) 
    to_plot = df[timestamp].groupby(pandas.TimeGrouper(freq=freq)).count() 
    ... 

nào mang lại cho tôi: ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

Trả lời

5

Bạn cũng có thể sử dụng get_dummies một d resample:

In [11]: df1 = df.set_index("Timestamp") 

In [12]: pd.get_dummies(df1["CAT"]) 
Out[12]: 
        200 300 400 
Timestamp 
2016-12-02 23:35:28 1 0 0 
2016-12-02 23:37:43 1 0 0 
2016-12-02 23:40:49 0 1 0 
2016-12-02 23:58:53 0 0 1 
2016-12-02 23:59:02 0 1 0 

In [13]: pd.get_dummies(df1["CAT"]).resample("10min").sum() 
Out[13]: 
        200 300 400 
Timestamp 
2016-12-02 23:30:00 2 0 0 
2016-12-02 23:40:00 0 1 0 
2016-12-02 23:50:00 0 1 1 
+0

Điều này sạch hơn tôi nhiều. Cảm ơn bạn! – andraiamatrix

4

IIUC:

In [246]: df.pivot_table(index='Timestamp', columns='CAT', aggfunc='size', fill_value=0) \ 
      .resample('10T').sum() 
Out[246]: 
CAT     200 300 400 
Timestamp 
2016-12-02 23:30:00 2 0 0 
2016-12-02 23:40:00 0 1 0 
2016-12-02 23:50:00 0 1 1 
5

Sử dụng pd.TimeGrouper

df.set_index('Timestamp') \ 
    .groupby([pd.TimeGrouper('10min'), 'CAT']) \ 
    .size().unstack(fill_value=0) 

CAT     200 300 400 
Timestamp       
2016-12-02 23:30:00 2 0 0 
2016-12-02 23:40:00 0 1 0 
2016-12-02 23:50:00 0 1 1