重写Python或计算列

2024-09-28 05:25:56 发布

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

我正在创建一个新专栏。它将引用A列中的文本(测试3字符串条件),结果将是B列中的文本。我有这段代码,它可以工作,但不知道是否有更干净更好的方法来完成这项任务。Psuedo代码应该是:如果“linemove”列包含这些字符串中的任何一个,则将结果表单带到“Home”列

melted.loc[(melted['linemove'] == 'bigger dog') | (melted['linemove'] == 'flipped, now dog') | (melted['linemove'] == 'smaller favorite'), 'betOn'] = melted['Home']
melted.loc[(melted['linemove'] == 'smaller dog') | (melted['linemove'] == 'flipped, now favorite') | (melted['linemove'] == 'bigger favorite'), 'betOn'] = melted['Road']

Tags: 字符串代码文本homenowlocfavoritedog
2条回答

另一种可能更短的方法是使用np.select.isin方法

import numpy as np
melted['betOn'] = np.select(
                      [ (melted['linemove'].isin(['bigger dog','flipped, now dog','smaller favorite']),
                        (melted['linemove'].isin(['smaller dog','flipped, now favorite','bigger favorite']),
                      [ melted['Home'], # what to use when condition1 is true
                        melted['Road'] ], # what to use when condition2 is true
                      default = melted['betOn'])

因为你只有两个条件,你也可以简单地做

melted.loc[melted['linemove'].isin(['smaller dog','flipped, now favorite','bigger favorite']), 'betOn'] = melted.loc[melted['linemove'].isin(['smaller dog','flipped, now favorite','bigger favorite']), 'Home']
melted.loc[melted['linemove'].isin(['smaller dog','flipped, now favorite','bigger favorite']), 'betOn'] = melted.loc[melted['linemove'].isin(['smaller dog','flipped, now favorite','bigger favorite']), 'Home']

np.select方法的优点是不必定位两行(左侧和右侧)

我认为很难缩短or,因为最终这就是您试图实现的逻辑

您可以通过定义一个布尔输出数组,然后使用该数组设置值,使其更具可读性,例如

my_condition = melted[ (melted['linemove'] == 'bigger dog') | (melted['linemove'] == 'flipped, now dog') | (melted['linemove'] == 'smaller favorite') ]

melted.loc[ my_condition, 'betOn' ] = melted.loc[ my_condition, 'Home' ]

并给my_condition起一个有意义的名字(我真的很难理解你的情况的上下文,所以才给它起个好名字!)

相关问题 更多 >

    热门问题