现在搜索一段时间,并且无法获得具体内容。寻找最佳实践答案。我的代码有效,但我不确定我是否会引入问题。
# 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(...))是"最差的"因为它迭代并且没有被矢量化。
答案 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))