为了账号安全,请及时绑定邮箱和手机立即绑定

将 lambda 与 pandas 一起使用以计算以现有列为条件的新列

将 lambda 与 pandas 一起使用以计算以现有列为条件的新列

Smart猫小萌 2023-06-13 17:20:32
我需要在 pandas DataFrame 中创建一个新列,该列计算为 DataFrame 中 2 个现有列的比率。但是,比率计算中的分母将根据在 DataFrame 的另一列中找到的字符串值而变化。例子。示例数据集:import pandas as pd df = pd.DataFrame(data={'hand'      : ['left','left','both','both'],                          'exp_force' : [25,28,82,84],                          'left_max'  : [38,38,38,38],                          'both_max'  : [90,90,90,90]})我需要df['ratio']根据 的条件创建一个新的 DataFrame 列df['hand']。如果df['hand']=='left'那么df['ratio'] = df['exp_force'] / df['left_max']如果df['hand']=='both'那么df['ratio'] = df['exp_force'] / df['both_max']
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您可以使用np.where():


import pandas as pd

df = pd.DataFrame(data={'hand'      : ['left','left','both','both'], 

                        'exp_force' : [25,28,82,84], 

                        'left_max'  : [38,38,38,38], 

                        'both_max'  : [90,90,90,90]})

df['ratio'] = np.where((df['hand']=='left'), df['exp_force'] / df['left_max'], df['exp_force'] / df['both_max'])

df


Out[42]: 

   hand  exp_force  left_max  both_max     ratio

0  left         25        38        90  0.657895

1  left         28        38        90  0.736842

2  both         82        38        90  0.911111

3  both         84        38        90  0.933333

或者,在现实生活中,如果您有很多条件和结果,那么您可以使用np.select(),这样您就不必np.where()像我在旧代码中所做的那样不断重复您的语句。最好np.select在这些情况下使用:


import pandas as pd

df = pd.DataFrame(data={'hand'      : ['left','left','both','both'], 

                        'exp_force' : [25,28,82,84], 

                        'left_max'  : [38,38,38,38], 

                        'both_max'  : [90,90,90,90]})

c1 = (df['hand']=='left')

c2 = (df['hand']=='both')

r1 = df['exp_force'] / df['left_max']

r2 = df['exp_force'] / df['both_max']

conditions = [c1,c2]

results = [r1,r2]

df['ratio'] = np.select(conditions,results)

df

Out[430]: 

   hand  exp_force  left_max  both_max     ratio

0  left         25        38        90  0.657895

1  left         28        38        90  0.736842

2  both         82        38        90  0.911111

3  both         84        38        90  0.933333


查看完整回答
反对 回复 2023-06-13
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

枚举


for i,e in enumerate(df['hand']):

 

  if e == 'left':

    df.at[i,'ratio'] = df.at[i,'exp_force'] / df.at[i,'left_max']

  if e == 'both':

    df.at[i,'ratio'] = df.at[i,'exp_force'] / df.at[i,'both_max']

df

输出:


    hand    exp_force   left_max    both_max    ratio

0   left    25            38          90      0.657895

1   left    28            38          90      0.736842

2   both    82            38          90      0.911111

3   both    84            38          90      0.933333


查看完整回答
反对 回复 2023-06-13
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

您可以使用apply()数据框的方法:


df['ratio'] = df.apply(

    lambda x: x['exp_force'] / x['left_max'] if x['hand']=='left' else x['exp_force'] / x['both_max'],

    axis=1

)


查看完整回答
反对 回复 2023-06-13
  • 3 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信