使用* args编写函数在pandas数据帧中创建一个新列

时间:2018-01-13 13:34:15

标签: python pandas dataframe

我是pandas的新手,我想知道如何通过在特定列上使用* args应用函数来在数据框中创建新列。

以下是我的数据框:

pri  pri_loc sec       s0  s0_loc  s1   s1_loc  s2   s2_loc
ABC  7       AB,BC,CA  AB  7       BC   7       CA   7
PQR  12      PQ,QR     PQ  NaN     QR   12      NaN  NaN
LMN  21      LM,MN,NM  LM  NaN     MN   NaN     NM   NaN
XYZ  5       ZX,YX,YZ  ZX  18      YX   25      YZ   34
RST  10      RT,ST     RT  50      ST   10      NaN  NaN
EFG  2       EF        EF  2       NaN  NaN     NaN  NaN
SRT  8       RK        RK  10      NaN  NaN     NaN  NaN
MSD  7       SD        SD  NaN     NaN  NaN     NaN  NaN
VK   18      NaN       NaN NaN     NaN  NaN     NaN  NaN

我想通过将pri_loc,s0_loc,s1_loc,s2_loc列的值传递给函数compare_loc来创建一个名为comp_loc的新列,该函数执行以下操作:

  1. 如果(所有s0_loc,s1_loc和s2_loc)==(pri_loc的值)那么它应该返回'same'

  2. if(所有s0_loc,s1_loc,s2_loc)为NULL然后它应该返回'doubt'

  3. if(s0_loc,s1_loc,s2_loc == pri_loc中的任何一个,如果还有其他!= pri_loc)那么它应该回复怀疑

  4. 如果(所有s0_loc,s1_loc,s2_loc!= pri_loc)它应该返回不相同的

  5. 注意当且仅当s0,s1,s2中的值不为空时,我想将s0_loc,s1_loc,s2_loc发送到compare_loc。 对于Eg。(如果s0为null,则不应将s0_loc发送到compare_loc函数...类似地,如果s1为null,则不应发送s1_loc,如果s2为null,则不应发送s2_loc)

    以下是输出数据帧:

       pri  pri_loc sec       s0  s0_loc  s1   s1_loc  s2   s2_loc  comp_loc
    0  ABC  7       AB,BC,CA  AB  7       BC   7       CA   7       same
    1  PQR  12      PQ,QR     PQ  NaN     QR   12      NaN  NaN     doubt
    2  LMN  21      LM,MN,NM  LM  NaN     MN   NaN     NM   NaN     doubt
    3  XYZ  5       ZX,YX,YZ  ZX  18      YX   25      YZ   34      not same
    4  RST  10      RT,ST     RT  50      ST   10      NaN  NaN     doubt
    5  EFG  2       EF        EF  2       NaN  NaN     NaN  NaN     same
    6  SRT  8       RK        RK  10      NaN  NaN     NaN  NaN     not same
    7  MSD  7       SD        SD  NaN     NaN  NaN     NaN  NaN     doubt
    8  VK   18      NaN       NaN NaN     NaN  NaN     NaN  NaN     NaN
    

    我可以获得有关如何实现这一目标的任何建议吗? 顺便说一下,我正在尝试使用 * args ..

    编写函数

1 个答案:

答案 0 :(得分:0)

以下是我用来实现所需输出的功能:

def isnan(value):
    try:
        return math.isnan(float(value))
    except:
        return False

def compare(p_loc,*args):
    fs = 0
    fns = 0
    fnan1 = 0
    fnan2 = 0
    fd1=0
    fd2=0
    if isnan(p_loc):
       return 'doubt'
    for k,v in enumerate(args):
        if v != p_loc:
            fs = 1
    for k,v in enumerate(args):
        if v == p_loc:
            fns = 1
    for k,v in enumerate(args):
        if isnan(v):
            fnan1 = 1
    for k,v in enumerate(args):
        if isnan(v):
            fnan2 = 1
    for k,v in enumerate(args):
        if v == p_loc:
            fd1 = 1
    for k,v in enumerate(args):
        if v != p_loc:
            fd2 = 1
    if fs ==0:
        return 'same'
    if fnan1 == 1:
        return 'doubt'
    elif (fd1 == 1 and fd2 == 1) and (fnan2 == 0):
        return 'doubt'
    elif fns == 0:
        return 'not same'    


def compare_locality(p,p_loc,s0,s0_loc,s1,s1_loc,s2,s2_loc):
    loc = []
    if not isnan(s0) :
        loc.append(s0_loc)
        if not isnan(s1) :
            loc.append(s1_loc)
            if not isnan(s2) :
                loc.append(s2_loc)
    if len(loc) == 0:
        return ''
    else:
        return compare(p_loc,*loc)

以下行调用上述函数并创建一个新列:

data['comp_loc'] = data.apply(lambda x: compare_locality(x['pri'],x['pri_loc'],x['s0'],x['s0_loc'],x['s1'],x['s1_loc'],x['s2'],x['s2_loc']),axis=1)