我编写了以下函数将一个值(col)与unit(ufrom)转换为另一个单元(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')
convert函数获取当前行,包含需要转换的值的列,源单元列以及目标单元。到目前为止它完美无缺。
正如你所看到的,我调用了这个函数三次,但我想知道我是否可以调用它一次并传递所有三个参数(Width,Length,Hight)并转换它们,因为它们具有相同的列,引用它们的单位(单位)和相同的目的地单位(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')
尝试使用*
- 语法传递1:n参数,但如何更改convert函数以提供多个或单个结果?
谢谢!
答案 0 :(得分: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')