Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 必须保持状态的函数中的groupby_Python_Pandas - Fatal编程技术网

Python 必须保持状态的函数中的groupby

Python 必须保持状态的函数中的groupby,python,pandas,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':

我有以下数据帧

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万个条目,250k个不同的“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

Woosh 4倍的速度提升和更短的解决方案!