2016-04-26 225 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