我有这个数据框架,df。
id order_exist ws_id ws_status_code order_id sql_status
19 False 9 50 19-9 None
19 False 10 50 19-10 None
19 False 11 50 19-11 None
19 False 12 29 19-12 None
19 False 13 0 19-13 None
19 True 14 20 19-14 None
19 False 15 0 19-15 None
19 True 16 35 19-16 None
19 True 17 20 19-17 None
我有一个元组列表,元组 。
[('19-16', 'delivery'), ('19-17', 'waiting_shipment'), ('19-14', 'test'), ('19-14', 'test'), ('27-1587739801134x592916474231783400', 'waiting_shipment')] 。
而我有这个功能。
def ckeck_order_status(order_id,tuple):
for o in tuple:
if o[0] == order_id:
return o[1]
else:
return None
我运行:
df['sql_status'] = df.apply(lambda x: ckeck_order_status(x['order_id'],tuple),axis=1)
为什么我只得到订单_id "19-16" 设置为已交付,而不是其他设置为相应的状态?
函数ckeck_order_status在完成for循环之前返回。
将函数改为
def ckeck_order_status(order_id,tuple):
for o in tuple:
if o[0] == order_id:
return o[1]
return None # only return None after exhausting for loop
产出(3个火柴)
id order_exist ... order_id sql_status
0 19 False ... 19-9 None
1 19 False ... 19-10 None
2 19 False ... 19-11 None
3 19 False ... 19-12 None
4 19 False ... 19-13 None
5 19 True ... 19-14 test
6 19 False ... 19-15 None
7 19 True ... 19-16 delivered
8 19 True ... 19-17 waiting_shipment
我认为@DarrylG 提供的答案是正确的(我也加了票)。
不过,如果你想找一个简单一点的问题解决方法,你可以避开这个问题。pandas.DataFrame.apply()
方法,您可以使用 pandas.Series.map
方法。结果是一样的,但代码更少。
>>> df['sql_status'] = df.order_id.map(dict(tuple))
>>> print(df)
id order_exist ws_id ws_status_code order_id sql_status
0 19 False 9 50 19-9 NaN
1 19 False 10 50 19-10 NaN
2 19 False 11 50 19-11 NaN
3 19 False 12 29 19-12 NaN
4 19 False 13 0 19-13 NaN
5 19 True 14 20 19-14 test
6 19 False 15 0 19-15 NaN
7 19 True 16 35 19-16 delivered
8 19 True 17 20 19-17 waiting_shipment