Python 如何在比较两个数据帧的基础上创建新列';唯一id?

Python 如何在比较两个数据帧的基础上创建新列';唯一id?,python,pandas,dataframe,lambda,series,Python,Pandas,Dataframe,Lambda,Series,嗨,我有两个数据帧,它们有OrderID和stage编号。我想为August Dataframe创建一个新列,如果orderID匹配,它将返回七月的阶段号中的值。如果没有,请返回“不适用” 如何使用lambda和apply函数创建此列?(不要使用join…) 任何线索和建议将不胜感激! 谢谢 您可以与系列一起使用。注意:如果您有NaN值,您的序列将被迫float,因为NaN是一个浮点值。这在不增加效率的情况下是不可避免的 aug = pd.DataFrame({'ID': [111, 222,

嗨,我有两个数据帧,它们有OrderID和stage编号。我想为August Dataframe创建一个新列,如果orderID匹配,它将返回七月的阶段号中的值。如果没有,请返回“不适用”

如何使用lambda和apply函数创建此列?(不要使用join…)

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

您可以与系列一起使用。注意:如果您有
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()
可以与系列一起使用。注意:如果您有
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()

虽然我不喜欢将此作为答案发布,但如果您仍然对使用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]})
映射器函数(类似于查找)

输出:

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

虽然我不喜欢将此作为答案发布,但如果您仍然对使用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]})
映射器函数(类似于查找)

输出:

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

为什么要使用
lambda
apply
?有更有效的方法可以做到这一点(使用
合并
映射
,或
加入
,尽管您明确表示不希望这样……)。此外,请将您的数据框作为文本发布,以便我们可以剪切和粘贴它们,而不是自己重新创建它们。这是一项任务。在这种情况下,应用将是低效的。为什么不使用join?为什么要使用
lambda
apply
?有更有效的方法可以做到这一点(使用
合并
映射
,或
加入
,尽管您明确表示不希望这样……)。此外,请将您的数据框作为文本发布,以便我们可以剪切和粘贴它们,而不是自己重新创建它们。这是一项任务。在这种情况下,应用将是低效的。为什么不使用join?非常感谢您的帮助。非常感谢您的帮助。