如何通过比较两个数据帧的唯一ID来创建新列?

时间:2018-09-24 17:11:06

标签: python pandas dataframe lambda series

Data

嗨,我有两个具有OrderID和阶段号的数据框。我想为August Dataframe创建一个新列,如果orderID匹配,它将返回7月的阶段号中的值。如果没有,请返回“ N / A”。

我应该如何使用lambda并应用函数来创建此列? (不要使用join ...)

任何线索和建议将不胜感激! 谢谢!

2 个答案:

答案 0 :(得分:3)

您可以将pd.Series.map与系列配合使用。请注意,如果您有<input type="date" class="form-control" [(ngModel)]="startDateTerm" [value]="startDateFilter"> 个值,则由于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

答案 1 :(得分:1)

尽管我讨厌将此作为答案发布,但如果您仍然对使用lambda感兴趣并申请,可以按照以下说明进行操作:

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