Возврат, если список последователен в столбце Python

У меня есть столбец в файле 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

Вы получаете ошибку TypeError: cons() got an unexpected keyword argument 'axis', потому что axis не является допустимым аргументом ключевого слова для Series.apply(), поскольку ось только одна. В будущем, пожалуйста, создайте минимально воспроизводимый пример , включая ошибку, и задайте по этому поводу конкретный вопрос. В конце концов, Stack Overflow — это сайт вопросов и ответов. Посмотрите тур , если вы еще этого не сделали. Дополнительные советы см. в разделе Как спросить.

wjandrea 30.05.2024 15:41

Дубликат: Проблема с передачей лямбды для применения к pandas DataFrame: «TypeError: <lambda>() получил неожиданный аргумент ключевого слова 'axis'». [Я уже проголосовал за закрытие статьи как «не воспроизводимо или вызвано опечаткой», прежде чем осознал, что по этому поводу могут возникнуть вопросы, извините.]

wjandrea 30.05.2024 15:46

«список строковых значений» — Строки? То, что вы показываете, это целые числа. Может быть, вы упростили код, но забыли обновить текст?

wjandrea 30.05.2024 15:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
82
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте 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 30.05.2024 07:26

@tonydanza123 Понятно, это действительно было неочевидно ;)

mozway 30.05.2024 07:41

@tonydanza123 tonydanza123 Я обновил ответ питоническим решением, вам не нужно сортировать (O(n*logn))

mozway 30.05.2024 07:45
Ответ принят как подходящий

Используйте понимание списка с проверкой, совпадают ли отсортированные значения со сгенерированным списком по минимальным и максимальным значениям списков:

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

Другие вопросы по теме

Похожие вопросы

Почему результаты Google Maps и Matplotlib различаются?
Есть ли способ получить массив двоичных чисел без предварительного преобразования его в строку?
Как расшифровать ключ, зашифрованный с помощью пакета натрия R в Python?
К чему относится ошибка «модуль langchain» не имеет атрибута «verbose»?
Почему VS Code показывает встроенные комментарии как часть переменных среды из файла .env?
Как избежать или обойти еженедельный повторный ввод учетных данных для Interactive Broker Gateway (IBGW), чтобы поддерживать соединение?
Оптимизация размещения узлов в 2D-сетке для соответствия определенным геодезическим расстояниям
Проблемы с потоками и горячими клавишами при использовании Pynput в Python (бесконечный цикл и скорость реагирования)
Полярный контурный график с нерегулярными «ячейками»
Почему распаковка списка при индексации является синтаксической ошибкой в ​​Python 3.8, но не в Python 3.12?