【问题标题】:Multiple input/output arguments for function in pythonpython中函数的多个输入/输出参数
【发布时间】:2018-03-22 15:25:32
【问题描述】:

我编写了以下函数来将单位(ufrom)的值(col)转换为另一个单位(uto):

def convert(row, col , ufrom, uto):
    convRow = convDF[(convDF.from == row[ufrom]) & (convDF.to == uto)]
    val = row[col] / convRow.factor
    return(val, uto)

convDF 是一个包含多个单位及其转换因子的数据框。我这样调用函数:

for idx, row in df.iterrows():
    if row.Unit!= 'MM':
        df.at[idx, ['Width', 'Unit']] = convert(row,'Width', 'Unit', 'MM')
        df.at[idx, ['Length', 'Unit']] = convert(row,'Length', 'Unit', 'MM')
        df.at[idx, ['Hight', 'Unit']] = convert(row,'Hight', 'Unit', 'MM')

转换函数获取当前行、包含需要转换的值的列、源单元列以及目标单元。到目前为止,它运行良好。

如您所见,我调用了该函数三次,但我想知道是否可以调用一次并传递所有三个参数(宽度、长度、高度)并转换它们,因为它们具有引用其单位的相同列( Unit) 和相同的目标单元 (uto)。所以我希望该函数能够处理单个值和多个值。 最后,这个

df.at[idx, ['Width', 'Unit']] = convert(row,'Width', 'Unit', 'MM')

应该和这个一样工作

df.at[idx, ['Width','Length','Hight', 'Unit']] = convert(row,['Width','Length','Hight'],'Unit', 'MM')

尝试使用 *-syntax 传递 1:n 参数,但如何更改转换函数以提供多个或单个结果?

谢谢!

【问题讨论】:

  • 你可以让你的函数接受 row 参数的迭代并将迭代移动到函数体。但在这种情况下,这只会使事情变得模糊。

标签: python pandas function multiple-columns


【解决方案1】:

您可以让您的函数将列列表作为参数,然后根据列列表中的内容返回一个列表。例如,

def convert(row, cols , ufrom, uto):
    values=[]
    for col in cols:
        convRow = convDF[(convDF.from == row[ufrom]) & (convDF.to == uto)]
        values.append(row[col] / convRow.factor) 
    values.append(ufrom) 
    return values

然后你可以这样称呼它

df.at[idx, ['Width','Length','Hight', 'Unit']] = convert(row,['Width','Length','Hight'],'Unit', 'MM')

或者在一列的情况下,只有一个元素的列表:

df.at[idx, ['Width', 'Unit']] = convert(row,['Width'],'Unit', 'MM')

【讨论】:

  • 谢谢,这就是我想要的!只有一个编辑:返回的单位值应该是目标单位,所以values.append(uto) 而不是values.append(ufrom) 是正确的。
猜你喜欢
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多