python - pandas 中的 groupby 具有必须保持状态的功能

标签 python pandas

我有以下数据框

df = pd.DataFrame({'a': ['A', 'A', 'A', 'B', 'B', 'B', 'B'],
                   'b': [  1,   2,   4,   1,   2,   3,   4]})

我想要一个可以输出以下数据帧定义的函数:

df = pd.DataFrame({'a': [  'A',   'A',   'A',   'B',   'B',   'B',   'B'],
                   'b': [    1,     2,     4,     1,     2,     3,     4],
                   'c': ['A_0', 'A_0', 'A_1', 'B_0', 'B_0', 'B_0', 'B_0']})

逻辑是,对于给定的每个“a”值(每个组),我创建一个值“c”,该值可以描述为“连续”系列的“b”值。

到目前为止,我的代码如下:

def detection(dataset):
    def detect(series, avalue):
        _id = 0
        start = True
        visits = []
        prev_ = None
        for h in series:
            if start:
                start = False
                prev_ = h
            else:
                if h - prev_ > 1:
                    _id += 1
                prev_ = h
            visits.append(f"{avalue}_{_id}")
        return visits

    res = []
    gb = dataset.groupby("a")
    for avalue in gb.groups:
        dd = gb.get_group(avalue)
        dd["VISIT_ID"] = detect(dd["b"], avalue)
        res.append(dd)
    return pd.concat(res, axis=0)

好处是,它运行完美! 缺点:在大型数据集(700 万个条目、25 万个不同的“a”值)上速度非常慢。

有什么更好的事情可以做吗?

最佳答案

您可以使用 groupby 和 concat 值查找 c 列的数字部分

df['c'] = df.groupby('a').b.apply(lambda x: (x.diff() > 1).cumsum())
df['c'] = df['a'] + '_' + df['c'].astype(str)


    a   b   c
0   A   1   A_0
1   A   2   A_0
2   A   4   A_1
3   B   1   B_0
4   B   2   B_0
5   B   3   B_0
6   B   4   B_0

关于python - pandas 中的 groupby 具有必须保持状态的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53488986/

相关文章:

python - 如何读取 Sphinx 扩展节点中的 conf.py 设置?

python - Matplotlib 图没有出现

python - 如何创建一个带有 2 个数据帧的 pandas 数据帧,一个作为列,一个作为行

python - python中字符串的子字符串

python - 当我将每个条形放在簇图顶部时,无法为每个条形设置不同的颜色

python - Pandas 按多列和值级别进行分组并将结果附加到原始数据框

python - 根据另一个列值更改 pandas DataFrame 列值

python - pandas:以特殊顺序合并两个数据框

python - 发现我的代码的复杂性

python - Python 中的快速求和