2017-02-03 5 views
1

私は時間の経過とともにいくつかの条件下で多数の動物の値を表す長い形式のデータフレームを持っています。 ここでは、動物と条件を分離して保ちながら、複数の時点の値を平均するためにビニングを適用したいと思います。python/pandasで長い形式のデータフレームをビニングする

私はunstack,groupbystackの操作の長いシーケンスを試しましたが、これを行うための簡潔な方法があると考えましたか?

基本的に、私は右の表を左側のテーブルから行きたいと思います:

enter image description here

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}) 

答えて

1

を私はあなたが必要だと思うcutgroupbyと:

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()) 
関連する問題