Dataframe apply (fun c) возвращает значение только в одной строке - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть этот фрейм данных, 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', 'доставлено'), ('19 -17 ',' wait_shipment '), ('19 -14', 'test'), ('19 -14 ',' test '), ('27 -1587739801134x592916474231783400', 'wait_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", установленный для доставки и другие не установлены в их соответствующий статус?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Функция ckeck_order_status возвращена до завершения для l oop.

Измените функцию на

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 голос
/ 26 апреля 2020

Я думаю, что ответ, предоставленный @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
...