我有一个具有以下结构的数据框:
>>>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'
的对应值并将其除以同一组(a,b等)中time
的其余值name
。我想保留其余的数据框。我无法找到使用df.apply的选项:
df.groupby(['name']).apply(lambda x: x['threshold'])
此后,我将无法对其进行申请df.where
,也无法通过df.apply使其满足多种条件。
所以答案应该做一个groupby
,apply
通过门槛,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
threshold等于no的值。
第二步有两个部分,第2.1部分
df.groupby('name')['no_time'].transform('max')
no_time
按组查找新列()的最大值,即阈值等于no的时间值。假设时间始终为正(或至少在阈值等于no的情况下)
最后一部分只是将df['time']
列与上一步(2.1)相除
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句