【问题标题】:Pandas DataFrame rolling countPandas DataFrame 滚动计数
【发布时间】:2019-01-03 06:54:27
【问题描述】:

我有以下熊猫数据框(只是一个例子):

import pandas as pd
df = pd.DataFrame(pd.Series(['a','a','a','b','b','c','c','c','c','b','c','a']), columns = ['Data'])


   Data
0     a
1     a
2     a
3     b
4     b
5     c
6     c
7     c
8     c
9     b
10    c
11    a

目标是获取另一列,Stats,它计算 Data 列的元素如下:

   Data Stats
0     a      
1     a      
2     a    a3
3     b      
4     b    b2
5     c      
6     c      
7     c      
8     c    c4
9     b    b1
10    c    c1
11    a    a1

例如,a3表示“三个连续的a元素”,c4表示“四个连续的c 元素”等等...

提前感谢您的帮助

【问题讨论】:

    标签: python pandas dataframe counting


    【解决方案1】:

    这是使用groupby的一种方式:

    counts = df.groupby((df['Data'] != df['Data'].shift()).cumsum()).cumcount() + 1
    
    df['Stats'] = np.where(df['Data'] != df['Data'].shift(-1),
                           df['Data'] + counts.astype(str), '')
    
    print(df)
    
       Data Stats
    0     a      
    1     a      
    2     a    a3
    3     b      
    4     b    b2
    5     c      
    6     c      
    7     c      
    8     c    c4
    9     b    b1
    10    c    c1
    11    a    a1
    

    【讨论】:

    • 谢谢@jpp 我会研究这两种解决方案,你的和来自jezrael 的。
    【解决方案2】:

    Data 列的连续值创建帮助器Seriess,通过GroupBy.transform 获取每个组的计数,最后将重复值替换为空strings:

    s = df['Data'].ne(df['Data'].shift()).cumsum()
    a = df.groupby(s)['Data'].transform('size')
    
    df['Stats'] = np.where(~s.duplicated(keep='last'), df['Data'] + a.astype(str), '')
    print (df)
       Data Stats
    0     a      
    1     a      
    2     a    a3
    3     b      
    4     b    b2
    5     c      
    6     c      
    7     c      
    8     c    c4
    9     b    b1
    10    c    c1
    11    a    a1
    

    详情

    print (s)
    0     1
    1     1
    2     1
    3     2
    4     2
    5     3
    6     3
    7     3
    8     3
    9     4
    10    5
    11    6
    Name: Data, dtype: int32
    
    print (a)
    0     3
    1     3
    2     3
    3     2
    4     2
    5     4
    6     4
    7     4
    8     4
    9     1
    10    1
    11    1
    Name: Data, dtype: int64
    

    不删除重复的解决方案更简单:

    df['Stats'] = df['Data'] + a.astype(str)
    print (df)
    
       Data Stats
    0     a    a3
    1     a    a3
    2     a    a3
    3     b    b2
    4     b    b2
    5     c    c4
    6     c    c4
    7     c    c4
    8     c    c4
    9     b    b1
    10    c    c1
    11    a    a1
    

    【讨论】:

    • 感谢@jezrael 提供的解决方案,我会研究它以提高我对python 的了解
    • @Gilberto - 我只是指出它是因为我看到我的解决方案被接受了,然后没有;)
    • 我想给这两个支票。对我来说,这两种解决方案都解决了问题,我认为它们对我来说都很有趣(我对 python 很陌生)
    猜你喜欢
    • 2022-10-05
    • 2021-04-08
    • 2018-12-17
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2017-08-01
    相关资源
    最近更新 更多