[英]python pandas how to use function with math use apply and lambda
我有一些带有示例 df 的程序片段:
import pandas as pd
from math import floor
d = {'ind': ['a', 'b', 'c'], 'col1': [1, 2, 3], 'col2': [4, 5, 6], 'col3': [7, 8, 9], 'spec': [9, 6, 3]}
df = pd.DataFrame(data=d).set_index('ind')
def func(x,y):
return (1-x)*(y+1)*0.9
print(df)
df2 = df.apply(lambda x: func(x, df.spec))
print(df2)
它工作正常,但是当我改变一点功能并添加floor
时:
def func(x,y):
return floor((1-x)*(y+1)*0.9)
有了它我有错误:
TypeError:无法将系列转换为 <class 'float'>
如何更改 df2 或 func 以使其正常工作?
好的回答后编辑:
现在我明白了,我忘记了我在 function 中有条件,我需要其他东西才能工作。
def func(x,y):
if x == 1:
return y
else:
return floor((1-x)*(y+1)*0.9)
在这个函数中,我得到了你的答案:
ValueError:Series 的真值不明确。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
if x == 1:
如果要使用math
模块中的floor
,则必须传递标量值而不是类似列表的值。 您可以使用理解:
def func(x,y):
return [floor(r) for r in (1-x)*(y+1)*0.9]
print(df.apply(lambda x: func(x, df.spec)))
# Output:
col1 col2 col3 spec
ind
a 0 -27 -54 -72
b -7 -26 -45 -32
c -8 -18 -29 -8
另一种方法是使用numpy
的floor
:
def func(x,y):
return np.floor((1-x)*(y+1)*0.9).astype(int)
print(df.apply(lambda x: func(x, df.spec)))
# Output:
col1 col2 col3 spec
ind
a 0 -27 -54 -72
b -7 -26 -45 -32
c -8 -18 -29 -8
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.