正确使用map将函数映射到df,python pandas

时间:2017-08-18 15:11:04

标签: python pandas

现在搜索一段时间,并且无法获得具体内容。寻找最佳实践答案。我的代码有效,但我不确定我是否会引入问题。

# df['Action'] = list(map(my_function, df.param1)) # Works but older 
    # i think?
df['Action'] = df['param1'].map(my_function)

这两个产生相同的可见结果。我不完全确定第一条注释掉的线是如何工作的,但这是我在互联网上找到的一个例子,我在这里申请并且它有效。我发现的地图的大多数其他用途都类似于第二行,从Series对象调用它。

首先提出问题,哪一个是更好的做法,第一个做的是什么?

第二个也是最后一个问题。这是两者中更重要的。 Map,apply,applymap - 不确定在这里使用哪个。 第一个注释掉的代码行不起作用,而第二行代码完全符合我的要求。

def my_function(param1, param2, param3):
    return param1 * param2 * param3 # example

# Can't get this df.map function to work?
# Error map is not attribute of dataframe
# df['New_Col'] = df.map(my_function, df.param1, df.param1.shift(1), 
#    df.param2.shift(1))

# TypeError: my_function takes 3 positional args, but 4 were given
# df['New_Col'] = df.apply(my_function, args=(df.param1, df.param1.shift(1), 
#    df.param2.shift(1)))

# This works, not sure why
df['New_Col'] = list(map(my_function, df.param1, df.param1.shift(1), 
     df.param2.shift(1)))

我尝试从当前行和上一行计算基于df的两列的结果。我已尝试过地图上的变体,并在直接从df调用时应用(df.map,df.apply)并且没有成功。但是如果我使用列表(map(...))表示法它很有用。

列表(地图(...))是否可以接受?哪个是最佳做法?有没有正确的方法直接从df对象使用apply或map?

谢谢你们,谢谢。

编辑:MaxU的回复也起作用。事实上,这两项工作都是:

df['New_Col'] = list(map(my_function, df.param1, df.param1.shift(1), 
        df.param2.shift(1)))
df['New_Col'] = my_function(df.parma1, df.param1.shift(1), df.param2.shift(1))

# This does NOT work
df['New_Col'] = df.apply(my_function, axis=1, args=(df.param1, 
        df.param1.shift(1), df.param2.shift(1)))
# Also does not work
# AttributeError: ("'float' object has no attribute 'shift'", 
    'occurred at index 2000-01-04 00:00:00')
# Will work if I remove the shift(), but not what I need.
df['New_Col'] = df.apply(lambda x: my_function(x.param1, x.param1.shift(1),
    x.param2.shift(1)))    

我还不清楚在这里使用apply的正确语法,如果这三种方法中的任何一种优于另一种(我猜测列表(map(...))是"最差的"因为它迭代并且没有被矢量化。

1 个答案:

答案 0 :(得分:3)

  

所以第一个问题,哪一个是更好的实践,究竟是什么   是第一个在做什么?

df['Action'] = df['param1'].map(my_function)

更加惯用,更快(矢量化)并且更可靠。

  

第二个也是最后一个问题。这是两者中更重要的。地图,   apply,applymap - 不确定在这里使用哪个。第一个评论出来了   代码行不起作用,而第二行则完全符合我的要求   想。

Pandas没有DataFrame.map() - 仅Series.map(),因此如果您需要访问映射功能中的多个列,则可以使用DataFrame.apply()

演示:

df['New_Col'] = df.apply(lamba x: my_function(x.param1,
                                              x.param1.shift(1),
                                              x.param2.shift(1),
                         axis=1) 

或只是:

df['New_Col'] = my_function(df.param1, df.param1.shift(1), df.param2.shift(1))