使用for循环简化重复乘法?

2024-05-19 00:22:27 发布

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

有没有更优雅的方法来编写这段代码?我一遍又一遍地做着同样的手术,所以感觉好像有,但我想不起来

成人是一个数据框架。体重是人的样本体重,每个ped变量代表不同的残疾类型

total_cognitive_m = (adults.weight * (adults.pedisrem==1)).sum()/1e6
total_mobility_m = (adults.weight * (adults.pedisout==1)).sum()/1e6
total_self_care_m = (adults.weight * (adults.pedisdrs==1)).sum()/1e6
total_physical_m = (adults.weight * (adults.pedisphy==1)).sum()/1e6 
total_vision_m = (adults.weight * (adults.pediseye==1)).sum()/1e6
total_hearing_m = (adults.weight* (adults.pedisear==1)).sum()/1e6
total_disabled_m = (adults.weight * adults.disabled).sum()/1e6

Tags: 数据方法代码框架total手术样本sum
3条回答

这段代码假设属性总是在变量上

'''
The common behaviour of picking an attribute on adult 
like pedisrem and doing ( adult.weights * <attribute of adults> == 1).sum()/1e6
has been achieved using list comprehension, we store those attributes
in equalsToOne array and iterate over them.

'''

multiplier = 'weight'
equalsToOne = ['pedisrem', 'pedisout', 'pedisdrs', 'pedisphy', 'pediseye', 'pedisear']
total_cognitive_m, total_mobility_m, total_self_care_m, \
 total_physical_m, total_vision_m, total_hearing_m = 
[(getattr(adults, multiplier) * getattr(adults, var) == 1).sum()/1e6
 for var in equalsToOne]
total_disabled_m = (adults.weight * adults.disabled).sum()/1e6

如果您可以创建一个函数来减少重复代码,这将有所帮助:

def calc(adults, name):
    return (adults.weight * (getattr(adults,name)==1)).sum() / 1e6

但是,如果您使用的是多个单独的变量,那么每个变量都必须有一个单独的赋值语句(不包括某些高级但“黑客”的解决方案):

total_cognitive_m = calc(adults, 'pedisrem')
total_mobility_m = calc(adults, 'pedisout')
... etc ...

如果您可以将输出数据放入某种集合,例如字典,则效果更好。在这种情况下,您可以执行以下操作,例如:

inputs_to_use = {
    'total_cognitive_m': 'pedisrem',
    'total_mobility_m': 'pedisout',
    ... etc ...
    }

然后,您可以使用以下工具创建输出词典:

outputs = { key: calc(adults, name) 
            for key, name in inputs_to_use.items() }

然后查找值,例如通过执行

print(outputs["total_cognitive_m"])

您可以定义一些集合来迭代数据,您可以使用元组来声明每个项目属性成人.pedisrem,成人.pedisout,成人.pedisdrs,…,然后使用数组存储每个结果

properties = ("pedisrem","pedisout","pedisdrs")
totalValues = ("total_cognitive_m","total_mobility_m","total_self_care_m")
relationShip = {}
i = 0
for item in properties:
    relationShip[totalValues[i]]  = (adults.weight * (adults[item]==1)).sum()/1e6
    i = i + 1;

print(relationShip);

相关问题 更多 >

    热门问题