计算一个值的出现,直到它更改为另一个值

发布于 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 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    采用:

    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
    

    说明

    将原始列按shifted与不等于进行比较ne,然后添加cumsumhelper Series

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看