python/pandas中长格式数据帧的分块

python/pandas中长格式数据帧的分块,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个长格式的数据框,表示在一段时间内,在多种条件下,许多动物的值。 现在,我想应用binning,以便在保持动物和条件分离的同时,平均多个时间点的值 我尝试了一系列冗长的取消堆栈、分组方式和堆栈操作,但我认为应该有一种简洁的方法来实现这一点 基本上,我想从左边的桌子转到右边的桌子: 我想您需要使用groupby: bins = [0, 4, 9] labels=['1-4','5-8'] df['bin'] = pd.cut(df['time'], bins=bins, labels=la

我有一个长格式的数据框,表示在一段时间内,在多种条件下,许多动物的值。 现在,我想应用binning,以便在保持动物和条件分离的同时,平均多个时间点的值

我尝试了一系列冗长的
取消堆栈
分组方式
堆栈
操作,但我认为应该有一种简洁的方法来实现这一点

基本上,我想从左边的桌子转到右边的桌子:

我想您需要使用
groupby

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())
print (df.groupby([pd.cut(df['time'], 
                   bins=[0, 4, 9], 
                   labels=['1-4','5-8']), 'animal','condition'])
         .val.mean().reset_index())