2016-12-05 5 views
3

(パンダを使用して)、2つの連続行を比較し、増加する値を割り当てる:私はそうのようなデータフレームdf_inを有する

import pandas as pd 
dic_in = {'A':['aa','aa','bb','cc','cc','cc','cc','dd','dd','dd','ee'], 
     'B':['200','200','200','400','400','500','700','700','900','900','200'], 
     'C':['da','cs','fr','fs','se','at','yu','j5','31','ds','sz']} 
df_in = pd.DataFrame(dic_in) 

Iは次のように2列AとBを調べたいです。 I 2連続が等しい場合、新しい値が割り当てられます(これについては、特定の規則に従って説明します)。 より明確にする例を挙げます:最初のrow[['A','B']]が次のものと等しい場合は、1と設定します。 2番目が3番目のものと等しい場合は、1と設定します。 2つの連続する行が異なるたびに、値を増やして1に設定します。

結果は次のようになります。

 A B C value 
0 aa 200 da  1 
1 aa 200 cs  1 
2 bb 200 fr  2 
3 cc 400 fs  3 
4 cc 400 se  3 
5 cc 500 at  4 
6 cc 700 yu  5 
7 dd 700 j5  6 
8 dd 900 31  7 
9 dd 900 ds  7 
10 ee 200 sz  8 

あなたは私にこの目標を達成するためのスマートなものをお勧めすることはできますか?

答えて

6

shiftanyを使用して、連続する行を比較し、値が変更される場所を示すTrueを使用します。

df_in['value'] = (df_in[['A', 'B']] != df_in[['A', 'B']].shift()).any(axis=1).cumsum() 

結果出力:

 A B C value 
0 aa 200 da  1 
1 aa 200 cs  1 
2 bb 200 fr  2 
3 cc 400 fs  3 
4 cc 400 se  3 
5 cc 500 at  4 
6 cc 700 yu  5 
7 dd 700 j5  6 
8 dd 900 31  7 
9 dd 900 ds  7 
10 ee 200 sz  8 
一行にそれを凝縮、或いは

:次いで、増加する値を取得するために、cumsumと累積和を取ります

関連する問題