Calculating the number of specific consecutive equal values in a vectorized way in pandasからのアプローチを使用して:
df['data'].groupby((df['cond'] != df['cond'].shift()).cumsum()).agg(['count', 'mean'])[lambda x: x['count']==x['count'].max()]
Out:
count mean
cond
3 3 1.466667
呼び出し可能なことで、インデックスは、以前のバージョンのために、あなたが行うことができ、0.18.0が必要です。
res = df['data'].groupby((df['cond'] != df['cond'].shift()).cumsum()).agg(['count', 'mean'])
res[res['count'] == res['count'].max()]
Out:
count mean
cond
3 3 1.466667
仕組み:
を最初の部分、 df['cond'] != df['cond'].shift()
はブール値配列を返します。
df['cond'] != df['cond'].shift()
Out:
0 True
1 True
2 True
3 False
4 False
5 True
6 True
Name: cond, dtype: bool
行が上記と同じであれば、値はFalseです。 GROUPBYは(列を渡す必要はありません上のグループに任意のシリーズを受け付けているので
(df['cond'] != df['cond'].shift()).cumsum()
Out:
0 1
1 2
2 3
3 3
4 3
5 4
6 5
Name: cond, dtype: int32
、あなたが渡すことができます:それはあなたが累積和を取る場合、これらの行(連続したもの)は同じ番号を持つことを意味します任意のリスト)、これを使用して結果をグループ化できます。 .agg(['count', 'mean']
の部分は、各グループのそれぞれのカウントと手段を与え、最後に最も高いカウントを持つものを選択します。
これは、連続するFalseをまとめてグループ化することに注意してください。あなただけの連続した真のを検討したい場合は、あなたがグループ化シリーズを変更することができます:我々は条件がTrueのときはFalseだたいので
((df['cond'] != df['cond'].shift()) | (df['cond'] != True)).cumsum()
、条件が「真OR下の行に等しいではないではない」となりました。元の行は次のように変更されます:
df['data'].groupby(((df['cond'] != df['cond'].shift()) | (df['cond'] != True)).cumsum()).agg(['count', 'mean'])[lambda x: x['count']==x['count'].max()]
既存のコードは何ですか? – kindall
[この質問](http://stackoverflow.com/q/29142487/2285236)を見てください。 – ayhan