Как создать новый столбец на основе сравнения уникального идентификатора двух датафреймов? - PullRequest
0 голосов
/ 24 сентября 2018

data

Привет, у меня есть два кадра данных, которые имеют OrderID и номера этапов.Я хочу создать новый столбец для августа Dataframe, который возвращает значения в июльском этапе, если идентификатор заказа совпадает.Если нет, пожалуйста, верните «N / A».

Как мне использовать лямбду и применять функции для создания этого столбца?(не используйте join ...)

Будем благодарны за любые подсказки и предложения!Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Хотя я ненавижу публиковать это как ответ, но если вы все еще заинтересованы в использовании лямбды и применять, вы можете, как показано ниже:

df=pd.DataFrame({'Order_id_July':[222,333,444,555,666,777],'stage':[1,2,3,4,5,6]})
df2=pd.DataFrame({'Order_id_August':[111,222,333,444,555]})

Функция картографирования (аналогично поиску)

def myfunc(row):
    if set([row[0]]).intersection(set(df.Order_id_July)):       
        return int(df[df.Order_id_July==row[0]]['stage'])
    return np.nan

df2['prior_stage']=df2.apply(lambda x:myfunc(x),axis=1)

Вывод:

Order_id_August prior_stage
    111         NaN
    222         1.0
    333         2.0
    444         3.0
    555         4.0

Если позже вы передумаете и захотите изучить более эффективные способы решения этой задачи, попробуйте код ниже

df2.merge(df,left_on='Order_id_August',right_on='Order_id_July',how='left').drop('Order_id_July',axis=1)

Order_id_August prior_stage
        111         NaN
        222         1.0
        333         2.0
        444         3.0
        555         4.0
0 голосов
/ 24 сентября 2018

Вы можете использовать pd.Series.map с серией.Обратите внимание, что если у вас есть значения NaN, ваша серия будет вынуждена ввести float, поскольку NaN является значением с плавающей запятой.Это неизбежно без добавления неэффективности.

aug = pd.DataFrame({'ID': [111, 222, 333, 444, 555], 'Prior': np.nan})
jul = pd.DataFrame({'ID': [222, 333, 444, 555, 666, 777], 'Stage': [1, 2, 3, 4, 5, 6]})

aug['Prior'] = aug['ID'].map(jul.set_index('ID')['Stage'])

print(aug)

    ID  Prior
0  111    NaN
1  222    1.0
2  333    2.0
3  444    3.0
4  555    4.0

Более длинное решение возможно через pd.Series.update и выравнивание индексов:

aug.set_index('ID', inplace=True)
aug['Prior'].update(jul.set_index('ID')['Stage'])
aug = aug.reset_index()
...