Использование понимания списка при создании конвейера pandas выдает объект функции, а не повторяемую ошибку

Мне нужно создать фрейм данных Pandas из файла csv с помощью конвейера. CSV-файл src может содержать любое количество столбцов с заголовком/именем, содержащим строку «SLA». Примеры данных ниже:

При создании конвейера pandas мне нужно извлечь и сохранить только строку до первого разделителя ('|') для всех столбцов SLA. Например, для ID=1 SLA1 в csv содержит значение «24h|0h|13h», и мне придется хранить только 24 часа в фрейме данных (аналогично для других столбцов SLA).

Мой код выглядит следующим образом:

import pandas as pd


def get_sla_cols(df):
    return [col for col in df.columns if 'SLA' in col]


def split(df, cols, split_str):
    for col in cols:
        df[col] = df[col].str.split(split_str, expand=True, n=1)[0]
    return df


csv_path = r"C:\Users\daryl\Downloads\svc.csv"
svc_df = (pd.read_csv(csv_path)
          .pipe(split, lambda x: x.pipe(get_sla_cols), '|'))
 

Я получаю следующую ошибку:

Но если я бегу:

print(pd.read_csv(csv_path).pipe(lambda x: x.pipe(get_sla_cols)))

Я получаю следующий результат, как и ожидалось:

Поскольку код lambda x: x.pipe(get_sla_cols) генерирует список имен столбцов, почему функция split(df, cols, split_str) выдает ошибку, из-за которой она не может перебирать список столбцов в цикле for? (см. скриншот ошибки).

Примечание. Если я заменю lambda x: x.pipe(get_sla_cols) жестко запрограммированным списком, скажем, ['SLA1', 'SLA2', 'SLA3', 'SLA4', 'SLA5'], код (функция Split()) не выдаст ошибок и будет работать должным образом.

Это потому, что вы поместили функцию в параметр cols. cols должен выполнять цикл for col in cols:, а функция — нет. Кроме того, если вы поставите список (['SLA1', 'SLA2', 'SLA3', 'SLA4', 'SLA5']), вы, конечно, сможете выполнить цикл.

Panda Kim 25.06.2024 15:49

@PandaKim - я хочу динамически создавать список столбцов SLA внутри конвейера. Если это возможно, можете ли вы помочь?

rams 25.06.2024 17:11

не публикуйте скриншот какой-либо программы для работы с электронными таблицами. CSV — это текст. Если у вас есть CSV, приведите пример в виде текста.

juanpa.arrivillaga 25.06.2024 18:42

Также не публикуйте скриншоты сообщений об ошибках. Публикуйте сообщения об ошибках в виде форматированного текста в самом вопросе.

juanpa.arrivillaga 25.06.2024 18:43

всегда помещайте код, данные и полное сообщение об ошибке в виде текста (не скриншота или ссылки), о котором идет речь (не в комментарии). Его будет более читабельно и проще использовать в ответе (проще выбрать и скопировать), и его увидит больше людей, поэтому больше людей смогут вам помочь.

furas 25.06.2024 23:45
Почему в 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
5
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

тогда это должно сработать:

svc_df = (pd.read_csv(csv_path)
          .pipe(lambda df: split(df, get_sla_cols(df), '|')))

Использование функции lambda для всего pipe.

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

Рассчитать расстояние до ближайшего объекта
Python Pandas: присоединение к регистронезависимому и лишенному ключу
Измените форму кадра данных Pandas и сгруппируйте столбцы двух уровней
Python: 3-сигма детектор «аномалий» количества заказов и строк
Как избежать цикла в Pandas, повторяющего уникальные значения?
Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Добавьте значения двух Dataframe на основе похожих значений строк
С помощью Python извлеките в файл Excel значение ячейки в строке, где ячейка в той же строке содержит строку символов из XML-файла
Обмен датой начала, датой окончания и другими столбцами с более ранней строкой, если даты больше 8 в фрейме данных pandas
Как я могу сравнить значение в одном столбце со всеми значениями, которые находятся ДО него в другом столбце, чтобы найти количество уникальных значений, которые меньше?