Dataframe apply(func)只在一行上返回值。

问题描述 投票:0回答:1

我有这个数据框架,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" 设置为已交付,而不是其他设置为相应的状态?

python dataframe apply
1个回答
2
投票

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

1
投票

我认为@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
© www.soinside.com 2019 - 2024. All rights reserved.