熊猫:从三列中选择一个值,然后将其指定为其他列中的值-应用熊猫

时间:2020-04-05 10:17:24

标签: pandas function apply

我很尴尬地问这个问题,但是三天后,我把头撞墙了。 我有一个带有ID的数据框和三个单独的字段,每个字段中都填充了替代网址。 我想按首选项顺序选择一个url(urlA,urlB,urlC),然后将所选内容分配给一个名为selectedUrl的新字段。 我有一个函数,查看是否填充了给定的url字段,如果是,它将返回该url。 我想将此功能作为pandas中的apply函数运行,以使其尽快运行。 我已经成功完成了类似的申请,但是每次我运行它时,都会返回一个空白。我无法共享实际的数据集,但是我创建了一个匿名版本供参考。

知道为什么它总是返回空白吗? 代码:

data = {'id': ['123','456','789'],
        'urlA': ['www.google.com','',''],
    'urlB': ['','www.amazon.com',''],
    'urlC': ['','','www.yahoo.com']
        }
df = pd.DataFrame(data, columns=['id','urlA','urlB','urlC'])

#function to select populated url - does the string contain a '.'?
def selectUrl(urlA,urlB,urlC):
    tmp = '.'
    if tmp in str(urlA):
        y= urlA
    elif tmp in str(urlB):
        y = urlB
    elif tmp in str(urlC):
        y= urlC
    else:
        y = ''
    return y

#Pandas apply statement
df['selectedURL']=df.apply(lambda x: selectUrl(x['urlA'],x['urlB'],x['urlB']), axis=1)

我希望它会返回

enter image description here

有什么想法吗?我在想,也许它返回了整个字段的对象,但该对象被忽略了,但无法弄清楚。毫无疑问,在有人指出某事之后,我将面对面,但我应得的!

任何建议都值得赞赏

1 个答案:

答案 0 :(得分:1)

因为这里是对列urlA进行优先级排序,然后对urlB和最后urlC进行优先排序,请按列表中的优先级选择此列(首先进行优先级排序),然后将空字符串替换为缺少的值,填充缺失值并按位置填充第一列:

df['url'] = df[['urlA','urlB','urlC']].replace('',np.nan).bfill(axis=1).iloc[:, 0]
print (df)
    id            urlA            urlB           urlC             url
0  123  www.google.com                                 www.google.com
1  456                  www.amazon.com                 www.amazon.com
2  789                                  www.yahoo.com   www.yahoo.com

在更改的数据中可以看到列表值顺序的重要性:

data = {'id': ['123','456','789'],
        'urlA': ['www.google.com','www.google.com',''],
    'urlB': ['','www.amazon.com','www.amazon.com'],
    'urlC': ['www.yahoo.com','','www.yahoo.com']
        }
df = pd.DataFrame(data, columns=['id','urlA','urlB','urlC'])

#A,B,C priority
df['url1'] = df[['urlA','urlB','urlC']].replace('',np.nan).bfill(axis=1).iloc[:, 0]
#C,B,A priority
df['url2'] = df[['urlC','urlB','urlA']].replace('',np.nan).bfill(axis=1).iloc[:, 0]
print (df)
    id            urlA            urlB           urlC            url1  \
0  123  www.google.com                  www.yahoo.com  www.google.com   
1  456  www.google.com  www.amazon.com                 www.google.com   
2  789                  www.amazon.com  www.yahoo.com  www.amazon.com   

             url2  
0   www.yahoo.com  
1  www.amazon.com  
2   www.yahoo.com