计算一个值的出现,直到它更改为另一个值
发布于 2021-01-29 16:53:28
我有以下DataFrame:
df = pd.DataFrame([10, 10, 23, 23, 9, 9, 9, 10, 10, 10, 10, 12], columns=['values'])
我想计算每个值的频率,而不是总计数-每个值的计数,直到它更改为另一个值。
我试过了:
df['values'].value_counts()
但这给了我
10 6
9 3
23 2
12 1
所需的输出是
10:2
23:2
9:3
10:4
12:1
我怎样才能做到这一点?
关注者
0
被浏览
203
1 个回答
-
采用:
df = df.groupby(df['values'].ne(df['values'].shift()).cumsum())['values'].value_counts()
要么:
df = df.groupby([df['values'].ne(df['values'].shift()).cumsum(), 'values']).size()
print (df) values values 1 10 2 2 23 2 3 9 3 4 10 4 5 12 1 Name: values, dtype: int64
最后删除第一级:
df = df.reset_index(level=0, drop=True) print (df) values 10 2 23 2 9 3 10 4 12 1 dtype: int64
说明 :
将原始列按
shift
ed与不等于进行比较ne
,然后添加cumsum
helperSeries
:print (pd.concat([df['values'], a, b, c], keys=('orig','shifted', 'not_equal', 'cumsum'), axis=1)) orig shifted not_equal cumsum 0 10 NaN True 1 1 10 10.0 False 1 2 23 10.0 True 2 3 23 23.0 False 2 4 9 23.0 True 3 5 9 9.0 False 3 6 9 9.0 False 3 7 10 9.0 True 4 8 10 10.0 False 4 9 10 10.0 False 4 10 10 10.0 False 4 11 12 10.0 True 5