开发者问题收集

Pandas Groupby 按递减顺序替换值

2019-12-29
118

对于 pandas 中的特定组,如何按递减顺序替换某一列中的值,其中第二列的最大值被保留,而其他值则从该值中减一?

我有一个包含 2 列 A 和 B 的数据框

输入:

A B

210 2
210 1
210 5
210 3
145 1
145 3
145 3
145 6

所需输出:


A B

210 2
210 3
210 4
210 5
145 3
145 4
145 5
145 6

2个回答

使用 groupby.cumcount 然后您可以使用 groupby.transform 添加 最大值 和组 大小 之间的差异:

groups = df.groupby('A').B
df['B']=( groups.cumcount()
                .add(1)
                .add(groups.transform('max')
                           .sub(groups.transform('size')) )
        )
print(df)

输出

     A  B
0  210  2
1  210  3
2  210  4
3  210  5
4  145  3
5  145  4
6  145  5
7  145  6

时间比较

%%timeit
groups = df.groupby('A').B
df['B']=( groups.cumcount()
                .add(1)
                .add(groups.transform('max')
                           .sub(groups.transform('size')))
        )
#3.33 ms ± 66 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
def custom_f(grp):
  m = grp.max()
  return np.arange(m - grp.shape[0]+1 , m+1)
df['B'] = df[['A','B']].groupby('A').transform(custom_f)
#9.18 ms ± 890 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
ansev
2019-12-29

您可以执行以下操作。基本上,我们为每个组创建一个范围,范围从 max - num_rows + 1m

def custom_f(grp):
  m = grp.max()
  return np.arange(m - grp.shape[0]+1 , m+1)
df['B'] = df[['A','B']].groupby('A').transform(custom_f)
thushv89
2019-12-29