2017-09-25 99 views
1

我有一個包含許多列的熊貓數據框(df)。爲了簡單起見,我在這裏張貼了三列虛擬數據。在熊貓數據框中分組列數據

Timestamp Source Length 
0   1    5 
1   1    5 
2   1    5 
3   2    5 
4   2    5 
5   3    5 
6   1    5 
7   3    5 
8   2    5 
9   1    5 

使用熊貓函數,首先我設置時間戳作爲df的索引。

index = pd.DatetimeIndex(data[data.columns[1]]*10**9) # Convert timestamp 
df = df.set_index(index) # Set Timestamp as index 

接着我可以使用GROUPBYpd.TimeGrouper功能組的數據進入5秒箱和計算用於每個區間累積長度如下:

df_length = data[data.columns[5]].groupby(pd.TimeGrouper('5S')).sum() 

所以df_length dataframe應該看起來像:

Timestamp  Length 
0    25 
5    25 

現在的問題是:「我想獲得的5秒同一箱,但螞蟻計算每個源(1,2和3)在單獨的列以下列格式的累計長度:

Timestamp 1  2  3 
0   15 10 0 
5   10 5  10 

我想我可以在某些條件下使用df.groupby來獲取它。但困惑,累壞了吧:(

使用熊貓功能欣賞解決方案只

+0

你的「僞數據」並不具有5列,所以你的'df_length'功能將無法正常工作 – asongtoruin

回答

1

您可以GROUPBY Source添加新列MultiIndex DataFrame,然後通過MultiIndexunstack末級列的重塑:

print (df[df.columns[2]].groupby([pd.TimeGrouper('5S'), df['Source']]).sum()) 
Timestamp   Source 
1970-01-01 00:00:00 1   15 
        2   10 
1970-01-01 00:00:05 1   10 
        2   5 
        3   10 
Name: Length, dtype: int64 

df1 = df[df.columns[2]].groupby([pd.TimeGrouper('5S'), df['Source']]) 
         .sum() 
         .unstack(fill_value=0) 
print (df1) 
Source    1 2 3 
Timestamp      
1970-01-01 00:00:00 15 10 0 
1970-01-01 00:00:05 10 5 10 
+1

我會使用數據透視表建議,但這是非常BETT呃。幹得不錯! – asongtoruin

+0

非常感謝。有用!但是,請您解釋一下代碼,它是如何工作的,因爲我可能會面臨一些其他類似的數據分組問題。 –