我是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的新列,该函数执行以下操作:
如果(所有s0_loc,s1_loc和s2_loc)==(pri_loc的值)那么它应该返回'same'
if(所有s0_loc,s1_loc,s2_loc)为NULL然后它应该返回'doubt'
if(s0_loc,s1_loc,s2_loc == pri_loc中的任何一个,如果还有其他!= pri_loc)那么它应该回复怀疑
如果(所有s0_loc,s1_loc,s2_loc!= pri_loc)它应该返回不相同的
注意当且仅当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 ..
编写函数答案 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)