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)