我很尴尬地问这个问题,但是三天后,我把头撞墙了。 我有一个带有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)
我希望它会返回
有什么想法吗?我在想,也许它返回了整个字段的对象,但该对象被忽略了,但无法弄清楚。毫无疑问,在有人指出某事之后,我将面对面,但我应得的!
任何建议都值得赞赏
答案 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