我如何以降序替换一列中的值,而保留第二列的最大值,而对于熊猫中的特定组,其他值从该值减一?
我有一个包含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
答案 0 :(得分:1)
使用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)
答案 1 :(得分:0)
您可以执行以下操作。基本上,我们为每个组创建一个范围,范围从max - num_rows + 1
到m
。
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)