跨每个数据帧列应用函数

2024-04-18 01:20:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据帧,它显示为:

df1['A'].ix[1:3]       Sims          Grade    SleepNumber
2017-01-01 02:00:00    [33, 34, 39]  5        6
2017-01-01 03:00:00    [3, 43, 9]    1        12

我有一个函数定义为:

def Fn(S, G, SL):
 #some complicated operation but for example it returns only product
 return S*G*SL

我想对df1的每一行执行以下操作,以获得如下数据帧:

df1['A'].ix[1:3]       FnResult
2017-01-01 02:00:00    [Fn(33, 5, 6), Fn(34, 5, 6), Fn(39, 5, 6)]  
2017-01-01 03:00:00    [Fn(3, 1, 12), Fn(43, 1, 12), Fn(9, 1, 12)]   

我尝试了以下方法:

z1 = df1.apply(map(lambda x:Fn([x, x.Grade, x.SleepNumber]), x.Sims))

但我没有正确设置它,所以它出错了。你知道吗


Tags: 数据函数定义defsomeoperationbutfn
1条回答
网友
1楼 · 发布于 2024-04-18 01:20:17

您可以将Fn重写为,因为S是一列列表:

def Fn(S, G, SL):
    return [s*G*SL for s in S]

df['FnResult'] = df.apply(lambda r: Fn(r.Sims, r.Grade, r.SleepNumber), axis=1).values.tolist()

df
#                           Sims    Grade   SleepNumber          FnResult
#2017-01-01 02:00:00    [33, 34, 39]    5           6   [990, 1020, 1170]
#2017-01-01 03:00:00      [3, 43, 9]    1           12     [36, 516, 108]

或者在不修改Fn的情况下,修改apply方法中的map函数;回想一下map本身是不可调用的,您需要将它包装在另一个lambda中:

df['FnResult'] = df.apply(lambda r: list(map(lambda s: Fn(s, r.Grade, r.SleepNumber), r.Sims)), axis=1)

df
#                               Sims    Grade   SleepNumber         FnResult
#2017-01-01 02:00:00    [33, 34, 39]        5           6    [990, 1020, 1170]
#2017-01-01 03:00:00    [3, 43, 9]          1           12      [36, 516, 108]

相关问题 更多 >

    热门问题