各グループで連続数のカウント

Find longest run of consecutive zeros for each user in dataframe – StackOverflow

回答,やたらややこしい事になっているけど,
そんなに複雑に考えないといけないだろうか.
基本ステートが0で,1が終了サインだとすれば,
グルーピングして,後は終了点(1)から開始点(0)
のインデックス差を求めれば良いだけだと思う.

Pandasの場合

import io
import pandas as pd


strings = """user--day--usage 
A-----1------0
A-----2------0
A-----3------1
B-----1------0
B-----2------1
B-----3------0"""

df = pd.read_csv(io.StringIO(strings), sep='[-]+', engine='python')
print(df)

res = df.groupby('user')['usage'].apply(lambda x: x.idxmax()-x.idxmin())
print(res)
  user  day  usage
0    A    1      0
1    A    2      0
2    A    3      1
3    B    1      0
4    B    2      1
5    B    3      0
user
A    2
B    1
Name: usage, dtype: int64

Pythonの場合

データフレームの処理を,ピュアに置き換えようと思うと,
collections.defaultdictがリーズナブル.

import re
from collections import defaultdict


strings = """user--day--usage 
A-----1------0
A-----2------0
A-----3------1
B-----1------0
B-----2------1
B-----3------0"""

dd = defaultdict(list)
for line in strings.splitlines()[1:]:
  lst = re.split(r'[-]+', line)
  dd[lst[0]].append(lst[-1])

print('user---longest_run')
for k, v in dd.items():
  print(f'{k}- - - -{v.index("1")}')
user---longest_run
A- - - -2
B- - - -1

Awk

%%bash
time {
echo """user--day--usage 
A-----1------0
A-----2------0
A-----3------1
B-----1------0
B-----2------1
B-----3------0""" |
awk 'BEGIN{FS="[-]+";OFS="----"}
  /0/{a[$1]+=1;next}
  /1/{print $1,a[$1];next}'
}
A----2
B----1

real    0m0.005s
user    0m0.003s
sys 0m0.003s
カテゴリー: 未分類 パーマリンク