2016-04-26 201 views
2

我想使用幾個列作爲行ID,同時根據時間進行分組計數。 看下面說明:列在熊貓數據框中的行

X Y Z Time 
0 1 2 10 
0 2 3 10 
1 0 2 15 
1 0 0 23 

變換成這樣:

Category Count Time 
    X  0 10 
    X  1 15 
    X  1 23 
    Y  3 10 
    Y  0 15 
    Y  0 23 
    Z  5 10 
    Z  2 15 
    Z  0 23 

正在發生的事情是,X發生0次的時間但1次15和23
Y出現3次'時鐘但沒有在15和23。等

+0

@EdChum我認爲這是成功的一半重複的,因爲在這[回答](http://stackoverflow.com/questions/19842066/python-pandas-certain-columns-to-rows)不與總和彙總。所以我刪除了重複。但是,如果您仍然認爲它是重複的,請添加它。 – jezrael

回答

2

我認爲你需要meltgroupbyCategory列聚集sum和最後sort_values

print pd.melt(df, id_vars='Time', var_name='Category', value_name='Count') 
     .groupby(['Time','Category']).sum().reset_index().sort_values('Category') 
    Time Category Count 
0 10  X  0 
3 15  X  1 
6 23  X  1 
1 10  Y  3 
4 15  Y  0 
7 23  Y  0 
2 10  Z  5 
5 15  Z  2 
8 23  Z  0 

stack另一種解決方案:

df1 = df.set_index('Time') 
     .stack() 
     .groupby(level=[0,1]) 
     .sum() 
     .reset_index() 
     .sort_values('level_1') 

df1.columns = ['Time','Category','Count'] 
df1 = df1[['Category','Count','Time']] 
print df1 
    Category Count Time 
0  X  0 10 
3  X  1 15 
6  X  1 23 
1  Y  3 10 
4  Y  0 15 
7  Y  0 23 
2  Z  5 10 
5  Z  2 15 
8  Z  0 23 
+0

工作就像一個魅力。非常感謝! – Anonymous