使用应用和位置更新熊猫数据框,然后再应用
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 来满足多个条件。
所以答案应该做一个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
的值是阈值等于 no.
第二步有两部分,第2.1部分
df.groupby('name')['no_time'].transform('max')
按组查找新列 (no_time
) 的最大值,即阈值等于 no 的时间值。假设时间总是正的(或者至少当阈值等于 no)
最后一部分只是将 df['time']
列除以上一步 (2.1)
中的列
我有一个具有以下结构的数据框:
>>>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 来满足多个条件。
所以答案应该做一个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
的值是阈值等于 no.
第二步有两部分,第2.1部分
df.groupby('name')['no_time'].transform('max')
按组查找新列 (no_time
) 的最大值,即阈值等于 no 的时间值。假设时间总是正的(或者至少当阈值等于 no)
最后一部分只是将 df['time']
列除以上一步 (2.1)