遍历数据框的行并按组重新分配最小值
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
我正在使用如下所示的数据框。
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