【问题标题】:Need to count repeating, consecutive values in python dataframe within a groupby需要计算分组内python数据框中重复的连续值
【发布时间】:2020-12-11 20:50:51
【问题描述】:
df = pd.DataFrame({'site':[1,1,1,1,1,1,1,1,1,1], 'parm':[8,8,8,8,8,9,9,9,9,9],
                   'date':[1,2,3,4,5,1,2,3,4,5], 'obs':[1,1,2,3,3,3,5,5,6,6]})

输出

   site  parm  date  obs
0     1     8     1    1
1     1     8     2    1
2     1     8     3    2
3     1     8     4    3
4     1     8     5    3
5     1     9     1    3
6     1     9     2    5
7     1     9     3    5
8     1     9     4    6
9     1     9     5    6

我想计算“site”和“parm”中重复的、连续的“obs”值。我有这段代码很接近:

df['consecutive'] = df.parm.groupby((df.obs != df.obs.shift()).cumsum()).transform('size')

输出

   site  parm  date  obs  consecutive
0     1     8     1    1            2
1     1     8     2    1            2
2     1     8     3    2            1
3     1     8     4    3            3
4     1     8     5    3            3
5     1     9     1    3            3
6     1     9     2    5            2
7     1     9     3    5            2
8     1     9     4    6            2
9     1     9     5    6            2

它使用计数创建新列。差距是当参数从 8 变为 9 时,它在参数 8 计数中包含参数 9。预期的输出是:

   site  parm  date  obs  consecutive
0     1     8     1    1            2
1     1     8     2    1            2
2     1     8     3    2            1
3     1     8     4    3            2
4     1     8     5    3            2
5     1     9     1    3            1
6     1     9     2    5            2
7     1     9     3    5            2
8     1     9     4    6            2
9     1     9     5    6            2

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    您需要按照问题中的指示将site, parm 扔到groupby

    df['consecutive'] = (df.groupby([df.obs.ne(df.obs.shift()).cumsum(),
                                     'site', 'parm']
                                    )
                         ['obs'].transform('size')
                         )
    

    输出:

       site  parm  date  obs  consecutive
    0     1     8     1    1            2
    1     1     8     2    1            2
    2     1     8     3    2            1
    3     1     8     4    3            2
    4     1     8     5    3            2
    5     1     9     1    3            1
    6     1     9     2    5            2
    7     1     9     3    5            2
    8     1     9     4    6            2
    9     1     9     5    6            2
    

    【讨论】:

    • 完美...感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2016-08-25
    • 2020-01-28
    • 2019-03-28
    • 2022-01-08
    • 2015-06-20
    相关资源
    最近更新 更多