Python 将数据帧传递到函数中,然后使用条件执行计算
我将一个大数据帧传递到一个函数中,我编写该函数是为了对条件进行一些计算,但Python返回了一个错误。我想这是因为我正在检查数据列是否等于某个特定值,然后执行一个计算,否则执行另一个计算 我尝试在pandas数组中进行计算,而不是在每行数据中循环,然后逐行计算,因为数据集很大 数据的一个子集如下所示:Python 将数据帧传递到函数中,然后使用条件执行计算,python,pandas,dataframe,Python,Pandas,Dataframe,我将一个大数据帧传递到一个函数中,我编写该函数是为了对条件进行一些计算,但Python返回了一个错误。我想这是因为我正在检查数据列是否等于某个特定值,然后执行一个计算,否则执行另一个计算 我尝试在pandas数组中进行计算,而不是在每行数据中循环,然后逐行计算,因为数据集很大 数据的一个子集如下所示: import pandas as pd myData = pd.DataFrame({'K':[810,820,825,830,840],'Type': ['C','C','P','P','C']
import pandas as pd
myData = pd.DataFrame({'K':[810,820,825,830,840],'Type':
['C','C','P','P','C'],'S':[978,978,978,978,978],'R':
[0.05,0.05,0.05,0.05,0.05]})
在数据帧中读取的函数如下所示:
def function(type,S,K,r):
if type == 'C':
calc = S / K * r
elif type == 'P':
calc = (S + r) / K - r * 10
return calc
我试图通过执行以下操作将myData传递到函数中:
function(myData['Type'],myData['S'],myData['K'],myData['r'])
错误消息是:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我认为这个错误与myData['Type']和Type='C'的条件有关。有没有办法解决这个问题,或者我必须遍历数据集并计算每一行?
谢谢。IIUC,您可以使用
np。选择:
condition = [myData.Type == 'C', myData.Type == 'P']
choiceList = [myData.S / myData.K * myData.R, (myData.S + myData.R) / myData.K - myData.R * 10]
np.select(condition,choiceList)
输出:
array([ 0.06037037, 0.05963415, 0.68551515, 0.67837349, 0.05821429])
IIUC,您可以使用np。选择:
condition = [myData.Type == 'C', myData.Type == 'P']
choiceList = [myData.S / myData.K * myData.R, (myData.S + myData.R) / myData.K - myData.R * 10]
np.select(condition,choiceList)
输出:
array([ 0.06037037, 0.05963415, 0.68551515, 0.67837349, 0.05821429])
我尝试使用myData.groupby('Type')
:
结果表明:
Out[149]:
K R S Type calc
0 810 0.05 978 C 0.060370
1 820 0.05 978 C 0.059634
2 825 0.05 978 P 0.685515
3 830 0.05 978 P 0.678373
4 840 0.05 978 C 0.058214
Uder 50的声誉是痛苦的添加评论!如果你喜欢它,就接受它吧 我尝试使用myData.groupby('Type')
:
结果表明:
Out[149]:
K R S Type calc
0 810 0.05 978 C 0.060370
1 820 0.05 978 C 0.059634
2 825 0.05 978 P 0.685515
3 830 0.05 978 P 0.678373
4 840 0.05 978 C 0.058214
Uder 50的声誉是痛苦的添加评论!如果你喜欢它,就接受它吧 使用myData.apply(lambda x:function(x['Type']、x['S']、x['K']、x['R']、axis=1)
或[函数(*x)表示zip中的x(myData['Type']、myData['S']、myData['K']、myData['R'])
或[函数(x['Type']、x['S']、x['K']、x['R'])表示myData中的x()。这三种方法都有效!我不熟悉Python和编程,你介意解释第二和第三种方法的含义吗?使用myData.apply(lambda x:function(x['Type']、x['S']、x['K']、x['R']、axis=1)
或[函数(*x)表示zip中的x(myData['Type']、myData['S']、myData['K']、myData['R'])
或[函数(x['Type']、x']、x['R']对于myData.iterrows()]
?@Zero中的x,谢谢您的输入。这三种方法都有效!我是Python和编程新手,你介意解释一下第二个和第三个方法是什么意思吗?谢谢你的输入,这个方法很有效。但是,我担心的是,“choiceList”计算列表中的值和存储,然后与“condition”列表进行比较。我不熟悉Python和编程,但这种方法似乎占用了大量内存,对吗?谢谢您的输入,这种方法很有效。但是,我担心的是,“choiceList”计算列表中的值和存储,然后与“condition”列表进行比较。我不熟悉Python和编程,但这种方法似乎会消耗大量内存,对吗?