Pandas: выберите значение из трех столбцов и присвойте ему значение в другом столбце - с помощью pandas применить - PullRequest
0 голосов
/ 05 апреля 2020

Мне стыдно спрашивать об этом, но через 3 дня я стучу головой о стену. У меня есть датафрейм с идентификатором и три отдельных поля, заполненные альтернативными URL-адресами. Я хочу выбрать URL-адрес в порядке предпочтения (urlA, urlB, url C) и назначить выбранное новое поле с именем selectedUrl. У меня есть функция, которая видит, заполнено ли заданное поле URL и если да, то возвращает этот URL. Я хотел запустить это как функцию применения в pandas, чтобы она работала как можно быстрее. Я сделал подобное применяется успешно, но каждый раз, когда я запускаю его, он возвращает пустое. Я не могу поделиться фактическим набором данных, но я создал анонимную версию для справки.

Есть идеи, почему он продолжает возвращать пробелы? Код:

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 Ответ

1 голос
/ 05 апреля 2020

Поскольку здесь есть приоритетный столбец 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  
...