Skip to main content
 首页 » 编程设计

python之pandas 根据上一列获取计数

2025年05月04日24bonelee

我想将列添加到 pandas 数据框,其中值是从另一列的值开始的递增值。例如,假设我有以下数据框。

df = pd.DataFrame([['a', 1], ['a', 1], ['b', 5], ['c', 10], ['c', 10], ['c', 10]], columns=['x', 'y']) 
df 
 
    x   y 
0   a   1 
1   a   1 
2   b   5 
3   c   10 
4   c   10 
5   c   10 

是否有一些 pandas 功能可以返回一个对每个组都具有递增值(value)的系列?换句话说,'a' 将以 1 开头,'b' 将以 5 和 'c 开头' 为 10。输出系列将是 (1, 2, 5, 10, 11, 12) 因此它可以像这样添加到原始数据帧中:

    x   y   z 
0   a   1   1 
1   a   1   2 
2   b   5   5 
3   c   10  10 
4   c   10  11 
5   c   10  12 

我尝试了以下方法:

z = [] 
for start, length in zip(df.y.unique(), df.groupby('x').agg('count')['y']): 
    z.append(list(range(start, length + start))) 
np.array(z).flatten() 
z 
 
[[1, 2], [5], [10, 11, 12]] 

这并没有完全满足我的需要,我不确定为什么数组没有变平,而且对于一个看似简单的任务来说似乎过于复杂。

编辑: 该解决方案也应该可以扩展到更复杂的数据帧,例如:

df = pd.DataFrame([['a', 1], ['b', 5], ['c', 10], ['d', 5]], columns=['x', 'y']) 
df = df.append([df]*(50),ignore_index=True) 

其中 'x' 列中的 'a' 和 'b' 值都等于 5。在这两种情况下,计数都应从 5

请您参考如下方法:

尝试:

df['z'] = df.y + df.groupby('y').apply(lambda df: pd.Series(range(len(df)))).values