1 回答
TA贡献1824条经验 获得超5个赞
您可以创建一个my_function()由调用的更高级别的函数(我们称之为),transform()然后调用一个较低级别的函数(我们称之为deeper_logic()),该函数应用您的问题中概述的先前逻辑,如下所示:
def my_function(group):
val = df.iloc[group.index]['Col4']
value = deeper_logic(group.iloc[0], val.iloc[0], group)
return [value if i==0 else value + '_red' for i in range(group.shape[0])]
def deeper_logic(x, val, group):
if group.shape[0]==1:
if x>val:
return 'high'
else:
return 'low'
if x>val and any(i<=val for i in group.iloc[1:]):
return 'high'
elif x>val:
return 'med'
elif x<=val:
return 'low'
else:
return np.nan
df['Col5'] = df.sort_values(['Col2','Col1']).groupby('Col2')['Col3'].transform(my_function)
这产生:
Col1 Col2 Col3 Col4 Col5
0 100 m1 1 4 low
1 200 m2 7 5 med
2 120 m1 4 4 low_red
3 240 m2 8 5 med_red
4 300 m3 5 4 high
5 330 m3 2 4 high_red
6 350 m3 11 4 high_red
7 200 m4 9 4 high
请注意,transform()对系列进行操作并返回一个类似索引的 NDFrame,这是我们想要的结果(即保留原始数据帧的索引)。因此,我们可以transform()使用我们的Col3列调用,然后在Col4从iloc调用的函数中使用从原始索引中提取相应的列值transform()。
添加回答
举报