在Pandas的两列中定义函数

时间:2018-12-17 13:17:45

标签: 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['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

3 个答案:

答案 0 :(得分:1)

您可以使用df['unit'].map()中的值映射到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']

我知道,它不能回答问题,但可以解决您的问题。

答案 1 :(得分:1)

apply 方法默认情况下遍历所有行,因此您不必在函数内部循环。它应该看起来像这样:

  def my_conversion(row):
    如果row ['unit'] =='b1':
        return(row ['value'] * 0.125)
    elif row ['unit'] =='b2':
        return(row ['value'] * 0.25)
    elif row ['unit'] =='b3':
        返回(行['值'] * 0.00781)
    elif row ['unit'] =='b4':
        return(row ['value'] / 3785411800000)
    其他:
        return(row ['value'])
 

您需要为整个df调用它:

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

答案 2 :(得分:0)

此网站显示了几种不同的方法,可以以不同的速度来完全满足您的要求。

https://realpython.com/fast-flexible-pandas/

这是我测试并工作的简单示例。

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