繁体   English   中英

python pandas 如何使用 function 与数学使用 apply 和 Z945F3FC449518A73B446F5F32868ZDB

[英]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

另一种方法是使用numpyfloor

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM