Как получить второй параметр map из метода apply?

#python #list #apply

#python #Список #применить

Вопрос:

У меня есть следующий набор данных:

  data = {"C1":[[(3, 5), (6, 8), (9-10)], [(0, 2), (5, 7), (9, 10)], [], [(1, 11)], [(0, 7), (8, 10)], [(5, 6)], [(0, 1)]]}
dt = pd.DataFrame(data)
print(dt)
  

это выглядит так:

     0       [(3, 5), (6, 8), (9,10)]
    1       [(0, 2), (5, 7), (9, 10)]
    2       []
    3       [(1, 11)]
    4       [(0, 7), (8, 10)]
    5       [(5, 6)]
    6       [(0, 1)]
  

Я хочу получить длину каждого кортежа (второй элемент кортежа минус первый элемент).

Мой любимый результат — что-то вроде

 0       [(3, 5), (6, 8), (9,10)]        [2,2,1]
1       [(0, 2), (5, 7), (9,10)]        [2,2,1]
2                         []            []
3                  [(1, 11)]            [10]
4          [(0, 7), (8, 10)]            [7,2]
5                   [(5, 6)]            [1]
6                   [(0, 1)]            [1]
  

В настоящее время я использую этот код:

 dt['C2] = dt['C1'].apply(list(map(lambda x: x[1]-x[0])))
  

Выдает следующую ошибку:

 map() must have at least two arguments
  

Поскольку я использую apply метод, я ожидаю, что второй параметр map будет автоматически получен apply , почему этого не происходит?

Ответ №1:

Лямбда-выражение, заданное для .apply() , применяется к каждой строке в столбце по отдельности. Таким образом, вы можете просто добавить понимание списка, чтобы делать то, что вы хотите:

 data = {"C1":[[(3, 5), (6, 8), (9, 10)], [(0, 2), (5, 7), (9, 10)], [], [(1, 11)], [(0, 7), (8, 10)], [(5, 6)], [(0, 1)]]}
dt = pd.DataFrame(data)
print(dt)

>>> dt['C2'] = dt['C1'].apply(lambda lst: [tup[1] - tup[0] for tup in lst])
>>> dt
                          C1         C2
0  [(3, 5), (6, 8), (9, 10)]  [2, 2, 1]
1  [(0, 2), (5, 7), (9, 10)]  [2, 2, 1]
2                         []         []
3                  [(1, 11)]       [10]
4          [(0, 7), (8, 10)]     [7, 2]
5                   [(5, 6)]        [1]
6                   [(0, 1)]        [1]