我想将列添加到 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
