#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]