遍历数据框的行并按组重新分配最小值

Iterate through the rows of a dataframe and reassign minimum values by group

我正在使用如下所示的数据框。

  id time diff
0 0   34   nan
1 0   36   2
2 1   43   7
3 1   55   12
4 1   59   4
5 2   2    -57
6 2   10   8

通过 id 找到 'time' 的最小值,然后在这些最小值处将 'diff' 设置为 nan 的有效方法是什么。我正在寻找导致以下结果的解决方案:

   id time diff
0 0   34   nan
1 0   36   2
2 1   43   nan
3 1   55   12
4 1   59   4
5 2   2    nan
6 2   10   8

你可以按id对时间进行分组,计算出一个逻辑向量,如果组内时间最小,则值为True,否则为False,并使用逻辑向量将NaN赋值给相应的行数:

import numpy as np
import pandas as pd
df.loc[df.groupby('id')['time'].apply(lambda g: g == min(g)), "diff"] = np.nan

df
#  id   time    diff
#0  0     34    NaN
#1  0     36    2.0
#2  1     43    NaN
#3  1     55    12.0
#4  1     59    4.0
#5  2      2    NaN
#6  2     10    8.0

groupby('id') 并使用 idxmin 找到 'time' 的最小值的位置。最后用loc赋值np.nan

df.loc[df.groupby('id').time.idxmin(), 'diff'] = np.nan
df