Мне нужно создать фрейм данных 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()) не выдаст ошибок и будет работать должным образом.
@PandaKim - я хочу динамически создавать список столбцов SLA внутри конвейера. Если это возможно, можете ли вы помочь?
не публикуйте скриншот какой-либо программы для работы с электронными таблицами. CSV — это текст. Если у вас есть CSV, приведите пример в виде текста.
Также не публикуйте скриншоты сообщений об ошибках. Публикуйте сообщения об ошибках в виде форматированного текста в самом вопросе.
всегда помещайте код, данные и полное сообщение об ошибке в виде текста (не скриншота или ссылки), о котором идет речь (не в комментарии). Его будет более читабельно и проще использовать в ответе (проще выбрать и скопировать), и его увидит больше людей, поэтому больше людей смогут вам помочь.
тогда это должно сработать:
svc_df = (pd.read_csv(csv_path)
.pipe(lambda df: split(df, get_sla_cols(df), '|')))
Использование функции lambda
для всего pipe
.
Это потому, что вы поместили функцию в параметр
cols
.cols
должен выполнять циклfor col in cols:
, а функция — нет. Кроме того, если вы поставите список (['SLA1', 'SLA2', 'SLA3', 'SLA4', 'SLA5']
), вы, конечно, сможете выполнить цикл.