嗨,我有两个具有OrderID和阶段号的数据框。我想为August Dataframe创建一个新列,如果orderID匹配,它将返回7月的阶段号中的值。如果没有,请返回“ N / A”。
我应该如何使用lambda并应用函数来创建此列? (不要使用join ...)
任何线索和建议将不胜感激! 谢谢!
答案 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