df = pd.DataFrame(data={'A': [1, 0, 3, 4, 5, 6, 7, 8, 0, 10],
'B': [10, 0, 13, 10, 0, 8, 12, 13, 15, 0],
'C': [2, 10, 0, 0, 10, 8, 12, 13, 0, 0],
'D': [3, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'E': [0, 3, 5, 10, 0, 8, 12, 13, 15, 0],
'F': [9, 5, 0, 10, 0, 8, 0, 13, 15, 0]})
def calcMoe(df, e1, m1, e2, m2, e3, m3, e4, m4):
x = 0
y = 0
if df[e1] == 0:
x = max(x, df[m1])
else:
y = y + df[m1] ** 2
if df[e2] == 0:
x = max(x, df[m2])
else:
y = y + df[m2] ** 2
if df[e3] == 0:
x = max(x, df[m3])
else:
y = y + df[m3] ** 2
if df[e4] == 0:
x = max(x, df[m4])
else:
y = y + df[m4] ** 2
return (x ** 2 + y)
使用以上数据集,此代码有效:
kwds = {'e1': 'A', 'm1': 'B', 'e2': 'C', 'm2': 'D', 'e3': 'E', 'm3': 'F', 'e4': 'D', 'm4': 'A'}
df['G'] = df.apply(calcMoe, axis=1, **kwds)
输出
A B C D E F G
0 1 10 2 3 0 9 191
1 0 0 10 2 3 5 29
2 3 13 0 3 5 0 187
3 4 10 0 4 10 10 232
4 5 0 10 5 0 0 50
5 6 8 8 6 8 8 200
6 7 12 12 7 12 0 242
7 8 13 13 8 13 13 466
8 0 15 0 9 15 15 450
9 10 0 0 10 0 0 200
这段代码给出了一个错误:TypeError:('calcMoe()正好接受17个参数(给定5个)',在索引0处发生''
kwds = {'e1': 'C', 'm1': 'F', 'e2': 'B', 'm2': 'A'}
df['G'] = df.apply(calcMoe, axis=1, **kwds)
一种解决方案是创建一个包含所有零值的列'z',并将e3,e4,m4,m5作为z零值列传递。
df['z']=0
kwds = {'e1': 'C', 'm1': 'F', 'e2': 'B', 'm2': 'A', 'e3':'z', 'm3':'z', 'e4':'z', 'm4':'z'}
df['G'] = df.apply(calcMoe, axis=1, **kwds)
此代码有效,但在我的情况下,我必须传递几个不同的参数对(e,m)。
是否有比使用零值创建列'z'更好的解决方案?谢谢你的帮助。
答案 0 :(得分:1)
您可以添加默认参数并检查calcMoe方法中的条件,即
def calcMoe(df, e1=None, m1=None, e2=None, m2=None, e3=None, m3=None, e4=None, m4=None):
x = 0
y = 0
if e1 != None:
if df[e1] == 0:
x = max(x, df[m1])
else:
y = y + df[m1] ** 2
if e2 != None:
if df[e2] == 0:
x = max(x, df[m2])
else:
y = y + df[m2] ** 2
if e3 != None :
if df[e3] == 0 :
x = max(x, df[m3])
else:
y = y + df[m3] ** 2
if e4 != None :
if df[e4] == 0 :
x = max(x, df[m4])
else:
y = y + df[m4] ** 2
return(x ** 2 + y)
然后** kwargs工作正常。