2017-01-13 106 views
2

我的輸入是一個兩列數據幀是這樣的:熊貓GROUPBY日期摸出頻率

Device, Date 
123414, 2016-11-01 
123456, 2016-10-25 
123414, 2016-10-29 
... 

我想創建是一個有三個列的數據幀,打破多少次,我們就必須每個設備日誌每天一次,兩次等。作爲一個例子,它應該看起來像這樣:

Date,  freq, count 
2016-10-01 01 296 
2016-10-01 02 137 
2016-10-01 03 30 
2016-10-02 01 301 
2016-10-02 02 201 
... 

我希望這已經夠清楚了。我寫的代碼是:

df['Freq'] = 1 
groupeddf = df.groupby(['Date','Device']).count() 
finaldf = groupeddf.groupby(['Date','Freq']).count() 

然而,它會彈出KeyError異常:「日期」
沒有人有其他方法有什麼建議,或者我可能會錯誤

回答

1

我想你可以通過新的列freq通過size,然後彙總size使用transform

print (df) 
    Device  Date 
0 123414 2016-11-01 
1 123456 2016-11-01 
2 123456 2016-10-25 
3 123414 2016-10-29 
4 123414 2016-10-29 
5 123414 2016-10-29 

df['freq'] = df.groupby(['Device','Date'])['Device'].transform('size') 
print (df) 
    Device  Date freq 
0 123414 2016-11-01  1 
1 123456 2016-11-01  1 
2 123456 2016-10-25  1 
3 123414 2016-10-29  3 
4 123414 2016-10-29  3 
5 123414 2016-10-29  3 

df = df.groupby(['Date','freq']).size().reset_index(name='count') 
print (df) 
     Date freq count 
0 2016-10-25  1  1 
1 2016-10-29  3  3 
2 2016-11-01  1  2 

此外,如果需要的所有組合frequnstackstack

df = df.groupby(['Date','freq']) 
     .size() 
     .unstack(fill_value=0) 
     .stack() 
     .reset_index(name='count') 

print (df) 
     Date freq count 
0 2016-10-25  1  1 
1 2016-10-25  3  0 
2 2016-10-29  1  0 
3 2016-10-29  3  3 
4 2016-11-01  1  2 
5 2016-11-01  3  0 
0

也許有一些誤解,但我讀你想每天每個設備的頻率的頻率的問題。這看起來是對@jezrael的一種不同的解釋。在這種情況下,你可以調用value_counts兩次,得到你想要的

使用比@jezrael你可以做以下

print (df) 
    Device  Date 
0 123414 2016-11-01 
1 123456 2016-11-01 
2 123456 2016-10-25 
3 123414 2016-10-25 
4 123414 2016-10-25 
5 123414 2016-10-29 
6 123414 2016-10-29 
7 123414 2016-10-29 
8 123456 2016-10-29 

df1 = df.groupby('Date')['Device'].apply(lambda x: pd.value_counts(x).value_counts()).reset_index() 
df1.columns = ['Date', 'freq', 'count'] 
df1.sort_values(['Date', 'freq']) 

隨着輸出略有不同的數據

  Date freq count 
1 2016-10-25  1  1 
0 2016-10-25  2  1 
3 2016-10-29  1  1 
2 2016-10-29  3  1 
4 2016-11-01  1  2