Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从表中的两列定义函数_Python - Fatal编程技术网

Python 从表中的两列定义函数

Python 从表中的两列定义函数,python,Python,我尝试根据第二列的单位转换第一列的值,我尝试了以下操作: def my_conversion(): for x in df['unit']: if x == 'b1': return(df['value'] * 0.125) elif x == 'b2': return(df['value'] * 0.25) elif x == 'b3': return(df['val

我尝试根据第二列的单位转换第一列的值,我尝试了以下操作:

def my_conversion():
    for x in df['unit']:
        if x == 'b1':
            return(df['value'] * 0.125)
        elif x == 'b2':
            return(df['value'] * 0.25)
        elif x == 'b3':
            return(df['value'] * 0.00781)
        elif x == 'b4':
            return(df['value'] / 3785411800000)
        else:
            return(df['value'])
然后我使用apply创建一个新列:

df['value_converted'] = df['value'].apply(my_conversion)
我不断得到以下错误:

my_conversion() takes 0 positional arguments but 1 was given

这个网站展示了几种不同的方法,以不同的速度水平,完全按照你的要求去做

这里有一个我测试过并有效的快速示例

def apply_tariff_isin(df):
    b1 = df.unit.isin(['b1'])
    b2 = df.unit.isin(['b2'])
    b3 = df.unit.isin(['b3'])
    b4 = df.unit.isin(['b4'])


    df.loc[b1, 'new_value'] = df.loc[b1, 'value'] * .125
    df.loc[b2,'new_value'] = df.loc[b2, 'value'] * .25
    df.loc[b3,'new_value'] = df.loc[b3, 'value'] * .00781
    df.loc[b4,'new_value'] = df.loc[b4, 'value'] / 3785411800000

您可以使用
.map()
df['unit']
中的值映射到if语句中的数值。然后,您可以以元素方式将这些映射值与df['value']相乘:

m = {'b1' : .125, 'b2' : .25, 'b3':  0.00781, 'b4': 1./3785411800000}
df['value_converted'] = df['unit'].map(m).fillna(1) * df['value']
与之相当,但更为详细、冗长和明确的是:

mapping_dictionary = {'b1': .125, 
                      'b2': .250, 
                      'b3': .00781, 
                      'b4': 1./37854118}

df['mapped_values'] = df['unit'].map(mapping_dictionary).fillna(1)
df['value_converted'] = df['mapped_values'] * df['value']

我知道,它没有回答这个问题,但它解决了您的问题。

apply
方法默认情况下运行于所有行,因此您不必在函数中有循环。应该是这样的:

def my_conversion(row):
    if row['unit']=='b1':
        return(row['value']*0.125)
    elif row['unit']=='b2':
        return(row['value']*0.25)
    elif row['unit']=='b3':
        return(row['value']*0.00781)
    elif row['unit']=='b4':
        return(row['value']/3785411800000)
    else:
        return(row['value'])
您需要为整个df调用它:

df['value_converted'] = df.apply(my_conversion, axis=1)

您在您的
elif
语句中有两次
x=='b3'
,对
df['value']
做了两件不同的事情,您能用完整的示例代码更新问题,以便我们重现问题吗?我已经更新了问题。谢谢
apply
将参数(行)传递给它,因此您必须在定义中考虑到这一点。我希望广播迭代你想要改变的独特单位。我建议注意确保你已经完全回答了这个问题。。。这意味着比80%的正确答案做得更好;-)我已经测试了这三种方法,它们都很好。非常感谢你的回答。我只是想告诉你为什么你最初的方法不起作用。此外,此解决方案不需要创建临时列。