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倍的速度提升和更短的解决方案!