Python 基于条件在某些组上的转换创建新列

Python 基于条件在某些组上的转换创建新列,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,在分组后,是否有更有效的方法来执行以下操作 对于每个组,我想获得最大值,其中时间为我认为在分组之前可以使用where。要获得更好的性能,请使用转换: df['new_value'] = df['values'].where(df.times < 3).groupby(df.group).transform('max') df group times values new_value 0 1 0 0.271137 0.751412 1

在分组后,是否有更有效的方法来执行以下操作

对于每个
,我想获得最大
,其中
时间
为我认为在分组之前可以使用
where
。要获得更好的性能,请使用
转换

df['new_value'] = df['values'].where(df.times < 3).groupby(df.group).transform('max')    
df

    group  times    values  new_value
0       1      0  0.271137   0.751412
1       1      1  0.262456   0.751412
2       1      2  0.751412   0.751412
3       1      3  0.364099   0.751412
4       1      4  0.462447   0.751412
5       2      0  0.022403   0.792396
6       2      1  0.792396   0.792396
7       2      2  0.181434   0.792396
8       2      3  0.106931   0.792396
9       2      4  0.226425   0.792396
10      3      0  0.425845   0.535085
11      3      1  0.527567   0.535085
12      3      2  0.535085   0.535085
13      3      3  0.194340   0.535085
14      3      4  0.958947   0.535085

酷。你知道为什么按多列分组会失败吗?在执行此操作之前,实际数据集有三个分组,我似乎无法将此处发布的groupby语法用于多个列…@anon01您的语法将略有不同。使用
.groupby([df['col1']、df['col2']、…])
在传递给
groupby的列表中将每列指定为单独的元素。。
for label, group in df.groupby(['group']):
    rows = group.index
    df.loc[rows,'new_value'] = group.loc[group.time <= 3, 'values'].max()
df['new_value'] = df['values'].where(df.times < 3).groupby(df.group).transform('max')    
df

    group  times    values  new_value
0       1      0  0.271137   0.751412
1       1      1  0.262456   0.751412
2       1      2  0.751412   0.751412
3       1      3  0.364099   0.751412
4       1      4  0.462447   0.751412
5       2      0  0.022403   0.792396
6       2      1  0.792396   0.792396
7       2      2  0.181434   0.792396
8       2      3  0.106931   0.792396
9       2      4  0.226425   0.792396
10      3      0  0.425845   0.535085
11      3      1  0.527567   0.535085
12      3      2  0.535085   0.535085
13      3      3  0.194340   0.535085
14      3      4  0.958947   0.535085
df['values'].where(df.times <= 3)

0     0.271137
1     0.262456
2     0.751412
3     0.364099
4          NaN
5     0.022403
6     0.792396
7     0.181434
8     0.106931
9          NaN
10    0.425845
11    0.527567
12    0.535085
13    0.194340
14         NaN
Name: values, dtype: float64