我有一个长格式的数据帧,表示一段时间内许多动物的数值。 现在我想应用分箱,以便在保持动物和条件分离的同时平均多个时间点的值。
我尝试了unstack
,groupby
和stack
个操作的冗长序列,但认为应该有一个简洁的方法来执行此操作?
基本上,我想从左边的桌子到右边的桌子:
import pandas as pd
import numpy as np
time=np.array([1,2,1,2,3,4,3,4,5,6,5,6,7,8,7,8])
animal=np.array([1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2])
condition=np.array(['a','b','a','b','a','b','a','b','a','b','a','b','a','b','a','b'])
val=np.random.random(16)
df=pd.DataFrame({'time':time,'animal':animal,'condition':condition,'val':val})
答案 0 :(得分:1)
我认为groupby
需要cut
:
bins = [0, 4, 9]
labels=['1-4','5-8']
df['bin'] = pd.cut(df['time'], bins=bins, labels=labels)
print (df)
animal condition time val bin
0 1 a 1 0.394700 1-4
1 1 b 2 0.492167 1-4
2 2 a 1 0.402880 1-4
3 2 b 2 0.354298 1-4
4 1 a 3 0.500614 1-4
5 1 b 4 0.445177 1-4
6 2 a 3 0.090433 1-4
7 2 b 4 0.273563 1-4
8 1 a 5 0.943477 5-8
9 1 b 6 0.026545 5-8
10 2 a 5 0.039999 5-8
11 2 b 6 0.283140 5-8
12 1 a 7 0.582344 5-8
13 1 b 8 0.990893 5-8
14 2 a 7 0.992642 5-8
15 2 b 8 0.993117 5-8
print (df.groupby(['bin','animal','condition'], as_index=False).val.mean())
bin animal condition val
0 1-4 1 a 0.447657
1 1-4 1 b 0.468672
2 1-4 2 a 0.246657
3 1-4 2 b 0.313931
4 5-8 1 a 0.762911
5 5-8 1 b 0.508719
6 5-8 2 a 0.516320
7 5-8 2 b 0.638129
无需创建新列的解决方案:
print (df.groupby([pd.cut(df['time'],
bins=[0, 4, 9],
labels=['1-4','5-8']), 'animal','condition'])
.val.mean().reset_index())