2016-11-30 18 views
2

私はこのようなデータフレームを持っている:パンダ累積数

0  04:10 obj1 
1  04:10 obj1 
2  04:11 obj1 
3  04:12 obj2 
4  04:12 obj2 
5  04:12 obj1 
6  04:13 obj2 

は、このようなすべてのオブジェクトの累積数を取得したい:それがあることを確認CUMSUMで遊んではなく、しようとしました

idx  time object obj1_count obj2_count 
0  04:10 obj1  1    0 
1  04:10 obj1  2    0 
2  04:11 obj1  3    0 
3  04:12 obj2  3    1 
4  04:12 obj2  3    2 
5  04:12 obj1  4    2 
6  04:13 obj2  4    3 

正しい道。助言がありますか?

答えて

3

あなただけの関心の値に対して列を比較し、cumsumを呼び出すことができます。

In [12]: 
df['obj1_count'] = (df['object'] == 'obj1').cumsum() 
df['obj2_count'] = (df['object'] == 'obj2').cumsum() 
df 

Out[12]: 
     time object obj1_count obj2_count 
idx          
0 04:10 obj1   1   0 
1 04:10 obj1   2   0 
2 04:11 obj1   3   0 
3 04:12 obj2   3   1 
4 04:12 obj2   3   2 
5 04:12 obj1   4   2 
6 04:13 obj2   4   3 

ここでの比較はブールシリーズ生成されます:あなたは上記にcumsumを呼び出すとき

In [13]: 
df['object'] == 'obj1' 

Out[13]: 
idx 
0  True 
1  True 
2  True 
3 False 
4 False 
5  True 
6 False 
Name: object, dtype: bool 

Trueの値は、1,False~0に変換され、累積的に合計されます。

2

cumsumpd.get_dummiesにすることで、このプロセスを一般化できます。

# Get the cumulative counts. 
counts = pd.get_dummies(df['object']).cumsum() 

# Rename the count columns as appropriate. 
counts = counts.rename(columns=lambda col: col+'_count') 

# Join the counts to the original df. 
df = df.join(counts) 

結果の出力:これはあなたが個別にいずれかを指定する必要がなく、カウントしたいオブジェクトの任意の数のために働く必要があり

time object obj1_count obj2_count 
0 04:10 obj1   1   0 
1 04:10 obj1   2   0 
2 04:11 obj1   3   0 
3 04:12 obj2   3   1 
4 04:12 obj2   3   2 
5 04:12 obj1   4   2 
6 04:13 obj2   4   3 

を、それはに許容だ場合は、renameステップを省略することができます接尾辞の代わりに接頭辞としてカウントを使用してください。つまり、'obj1_count'ではなく'count_obj1'です。

counts = pd.get_dummies(df['object'], prefix='count').cumsum() 
0

ここでnumpyの

u, iv = np.unique(
    df.object.values, 
    return_inverse=True 
) 

objcount = pd.DataFrame(
    (iv[:, None] == np.arange(len(u))).cumsum(0), 
    df.index, u 
) 
pd.concat([df, objcount], axis=1) 

enter image description here

を使用しての方法です:単に pd.get_dummiesprefixパラメータを使用