使用应用和位置更新熊猫数据框,然后再应用

Updating a Panda dataframe using an apply and where, and a second apply

我有一个具有以下结构的数据框:

>>>df  
               name  threshold      ...   time                     
   0            a          no       ...   1.1
   1            a          1        ...   1.5
   2            b          no       ...   1.1
   3            a          2        ...   1.5
   ...

对于每个名称(groupby),我想找到df.where['threshold']=='no'并将time的相应值除以同一组中的其余name(a 、b 等)。我想保留数据框的其余部分。我找不到使用 df.apply:

的选项
df.groupby(['name']).apply(lambda x: x['threshold'])

之后,我无法在其上应用 df.where 并且我无法使用 df.apply 来满足多个条件。

所以答案应该做一个groupbyapply按阈值,where阈值是没有,find对应的时间值和divide那个同一组中的所有名称。请注意,每个组名只有一个 no

感谢您的任何建议。

IIUC,你可以这样做:

df['no_time'] = df['threshold'].eq('no') * df['time']

df['time'] = df['time'] / df.groupby('name')['no_time'].transform('max')

res = df.drop('no_time', axis=1)

print(res)

输出

  name threshold      time
0    a        no  1.000000
1    a         1  1.363636
2    b        no  1.000000
3    a         2  1.363636

第一步:

df['no_time'] = df['threshold'].eq('no') * df['time']

创建一个新列,其中唯一不同于 0 的值是阈值等于 no.

第二步有两部分,第2.1部分

df.groupby('name')['no_time'].transform('max')

按组查找新列 (no_time) 的最大值,即阈值等于 no 的时间值。假设时间总是正的(或者至少当阈值等于 no

最后一部分只是将 df['time'] 列除以上一步 (2.1)

中的列