Python 3.x 如何将数据帧列作为**KWARG传递?
使用上述数据集此代码有效:Python 3.x 如何将数据帧列作为**KWARG传递?,python-3.x,pandas,Python 3.x,Pandas,使用上述数据集此代码有效: 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,
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)
这段代码给出了一个错误:TypeError:('calcMoe()正好接受17个参数(5个给定参数)'u'出现在索引0')
一种解决方案是创建一个包含所有零值的列“z”,并将e3、e4、m4、m5作为z零值列传递。
kwds = {'e1': 'C', 'm1': 'F', 'e2': 'B', 'm2': 'A'}
df['G'] = df.apply(calcMoe, axis=1, **kwds)
这段代码可以工作,但在我的例子中,我必须传递几个不同的参数对(e,m)
有没有比创建具有零值的列“z”更好的解决方案?谢谢您的帮助。您可以添加默认参数并检查calcMoe方法中的条件,即
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)
那么**kwargs工作得很好
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)
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)