Pandas 从分组数据框中计算连续相等值的长度

Posted

技术标签:

【中文标题】Pandas 从分组数据框中计算连续相等值的长度【英文标题】:Pandas calculate length of consecutive equal values from a grouped dataframe 【发布时间】:2015-06-20 20:16:47 【问题描述】:

我想做他们在答案中所做的事情:Calculating the number of specific consecutive equal values in a vectorized way in pandas ,但使用分组数据框而不是系列。

所以给定一个包含多列的数据框

A    B    C   
------------ 
x    x    0
x    x    5
x    x    2
x    x    0
x    x    0
x    x    3
x    x    0
y    x    1
y    x    10
y    x    0
y    x    5
y    x    0
y    x    0

我想对列 A 和 B 进行分组,然后计算 C 中连续零的数量。之后,我想返回每个零长度出现的次数的计数。所以我想要这样的输出:

A    B    num_consecutive_zeros  count
---------------------------------------
x    x            1                2
x    x            2                1
y    x            1                1
y    x            2                1

我不知道如何调整链接问题的答案以处理分组数据框。

【问题讨论】:

目标输出的前两行和后两行有什么区别?为什么不把这些组合在一起。我不确定你是否清楚地解释了你想要实现的逻辑。 @Alexander 取前两行 (x x),单个零模式在该分组中出现 2 次。两个连续的零模式在该分组中出现一次。最后两行用于具有相同逻辑的 (y x) 分组。有意义吗? 是的,@BobHaffner 就是这么解释的。我应该为玩具示例的 A 和 B 列选择更好的值。 因此,如果前七行(所有 A='x')的值一组接一组连续出现,那么 num_consecutive_zeros 的所需输出将为 1、2、1、2计数=2,1,2,1?还是分别是 2、4 和 4,2? 【参考方案1】:

这是代码,count_consecutive_zeros() 使用 numpy 函数,pandas.value_counts() 获取结果,并使用groupby().apply(count_consecutive_zeros) 为每个组调用count_consecutive_zeros()。调用reset_index()MultiIndex 更改为列:

import pandas as pd
import numpy as np
from io import BytesIO
text = """A    B    C   
x    x    0
x    x    5
x    x    2
x    x    0
x    x    0
x    x    3
x    x    0
y    x    1
y    x    10
y    x    0
y    x    5
y    x    0
y    x    0"""

df = pd.read_csv(BytesIO(text.encode()), delim_whitespace=True)

def count_consecutive_zeros(s):
    v = np.diff(np.r_[0, s.values==0, 0])
    s = pd.value_counts(np.where(v == -1)[0] - np.where(v == 1)[0])
    s.index.name = "num_consecutive_zeros"
    s.name = "count"
    return s

df.groupby(["A", "B"]).C.apply(count_consecutive_zeros).reset_index()

【讨论】:

以上是关于Pandas 从分组数据框中计算连续相等值的长度的主要内容,如果未能解决你的问题,请参考以下文章

在有序数据集中指定连续相等值的组

对 pandas 数据框中的连续值进行分组

c_cpp 用一个更大的值替换两个连续的相等值

快速排序中相等值的比较

在窗口函数中计算具有相等值的行

创建具有不相等值列表的熊猫数据框