如何将Pandas数据帧列作为** kwargs传递?

时间:2017-09-03 15:46:45

标签: 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, 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'更好的解决方案?谢谢你的帮助。

1 个答案:

答案 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工作正常。