我想使用几列作为行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 在 10 时出现0次,对于 15和23 出现1次。
Y 在 10 时出现3次,但在 15和23 时出现 。等
答案 0 :(得分:2)
我认为您需要melt
groupby
聚合sum
,最后sort_values
按Category
列:
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