У меня есть столбец в файле df с меткой a. Он содержит список целочисленных значений. Я хочу вернуться, если они последовательные или нет.
Я могу сделать это, передав один список, но я хочу перебирать каждую строку.
df = pd.DataFrame({'a': [[0,2], [9,11,12], [0,1,2], [10,11,13]]})
def cons(L):
return all(n-i == L[0] for i,n in enumerate(L))
print(cons(df['a'][0])) # works
df['cons'] = df['a'].apply(cons, axis=1) # error
намеревался:
a cons
0 [0, 2] False
1 [9, 11, 12] False
2 [0, 1, 2] True
3 [10, 11, 13] False
Дубликат: Проблема с передачей лямбды для применения к pandas DataFrame: «TypeError: <lambda>() получил неожиданный аргумент ключевого слова 'axis'». [Я уже проголосовал за закрытие статьи как «не воспроизводимо или вызвано опечаткой», прежде чем осознал, что по этому поводу могут возникнуть вопросы, извините.]
«список строковых значений» — Строки? То, что вы показываете, это целые числа. Может быть, вы упростили код, но забыли обновить текст?






Используйте itertools.pairwise для сравнения последовательных значений:
def cons(L):
from itertools import pairwise
return all(a==b-1 for a,b in pairwise(L))
df['cons'] = df['a'].apply(cons)
Выход:
a cons
0 [10, 11, 12] True
1 [10, 11, 12] True
2 [10, 11, 12] True
3 [10, 11, 13] False
извини. Цель вопроса не меняется, но мне следовало бы привести более точный пример.
@tonydanza123 Понятно, это действительно было неочевидно ;)
@tonydanza123 tonydanza123 Я обновил ответ питоническим решением, вам не нужно сортировать (O(n*logn))
Используйте понимание списка с проверкой, совпадают ли отсортированные значения со сгенерированным списком по минимальным и максимальным значениям списков:
df['cons'] = [sorted(l) == list(range(min(l), max(l)+1)) for l in df['a']]
#alternative
df['cons'] = df['a'].apply(lambda l: sorted(l) == list(range(min(l), max(l)+1)))
Другая идея — использовать np.diff для проверки разницы 1 для всех значений:
df['cons'] = [np.all(np.diff(sorted(l)) == 1) for l in df['a']]
#alternative
df['cons'] = df['a'].apply(lambda l: np.all(np.diff(sorted(l)) == 1))
Если хотите использовать ваше решение:
def cons(L):
return all(n-i==L[0] for i,n in enumerate(L))
df['cons'] = df['a'].apply(cons)
#alternative
df['cons'] = [all(n-i==L[0] for i,n in enumerate(L)) for L in df['a']]
print (df)
a cons
0 [0, 2] False
1 [9, 11, 12] False
2 [0, 1, 2] True
3 [10, 11, 13] False
Вы получаете ошибку
TypeError: cons() got an unexpected keyword argument 'axis', потому чтоaxisне является допустимым аргументом ключевого слова дляSeries.apply(), поскольку ось только одна. В будущем, пожалуйста, создайте минимально воспроизводимый пример , включая ошибку, и задайте по этому поводу конкретный вопрос. В конце концов, Stack Overflow — это сайт вопросов и ответов. Посмотрите тур , если вы еще этого не сделали. Дополнительные советы см. в разделе Как спросить.