首页 > 解决方案 > Dataframe apply(func) 仅在一行上返回值

问题描述

我有这个数据框 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', 'delivered'), ('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)

为什么我只将 order_id "19-16" 设置为已交付,而其他设置为相应状态?

标签: pythondataframeapply

解决方案


函数 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

推荐阅读