Вывод отфильтрованных данных из таблицы в виде строки
Работаю с библиотекой pandas. Отфильтрованные данные нужно вывести в виде строки. Для этого использую to_string:
df = pd.read_excel('data.xlsx')
baza=df.loc[df['NASTROY'] == 'Чиловое', 'FILMS'].sample(n=3).to_string(index=False, header=False)
print(baza)
Данные выводятся в виде нескольких строк. Есть ли возможность вывести эти строки в одну, со значениями через запятую, например?
Ответы (2 шт):
Структура - правильная, но вам надо добавить ещё две строчки кода:
filtered_films = df.loc[df['NASTROY'] == 'Чиловое', 'FILMS'].sample(n=3)
baza = filtered_films.str.cat(sep='<<<SEP>>>')
Этой строчкой кода мы объединяем выбранные записи в строку, разделяя их с помощью '<<<SEP>>>'
Использование конкатенации в виде pandas.Series.str.cat или str.join подходит не всегда. Рассмотрим контекст: из таблицы Excel загружаются данные о фильмах, мы отбираем часть названий из поля "Films" и используем их в виде одной строки, соединив через запятую. Опираясь на свою практику, я бы учёл следующее:
- В названии могут быть запятые, одинарные и двойные кавычки.
- При заполнении таблицы могут быть вставлены принудительные разрывы строк.
- Если это база телевизионных или ютубовских сюжетов, то их названия непредсказуемы.
Пример выборки:
import pandas as pd
df = pd.DataFrame({'Films': [
"Dr. Strangelove or:\nHow I Learned to Stop Worrying and Love the Bomb",
"O Brother, Where Art Thou?",
"Who's Afraid of Virginia Woolf?",
'В бой идут одни "старики"'
]})
print(df.to_string())
# Films
# 0 Dr. Strangelove or:\nHow I Learned to Stop Worrying and Love the Bomb
# 1 O Brother, Where Art Thou?
# 2 Who's Afraid of Virginia Woolf?
# 3 В бой идут одни "старики"
Как может выглядеть конкатенация:
print(df['Films'].str.cat(sep=', '))
# Dr. Strangelove or:
# How I Learned to Stop Worrying and Love the Bomb, O Brother, Where Art Thou?, Who's Afraid of Virginia Woolf?, В бой идут одни "старики"
Как видим, может возникнуть трудность с идентификацией данных из разных ячеек из-за перевода строк и запятых в названиях. Против перевода строки применяем repr. Разделитель же можем подобрать, однако это разовое решение: при регулярном выполнении программы нужно проверять, не является ли он частью обновленных данных.
Есть другой подход - использовать воспроизводимые схемы представления данных. Например, мы можем выводить их в виде пайтоновского списка:
print(df['Films'].tolist())
# ['Dr. Strangelove or:\nHow I Learned to Stop Worrying and Love the Bomb', 'O Brother, Where Art Thou?', "Who's Afraid of Virginia Woolf?", 'В бой идут одни "старики"']
Ещё вариант - трансформировать выборку в строку CSV или JSON:
sep = ', '
print(repr(df['Films'].to_csv(header=False, index=False, lineterminator=sep))[1:-1].rstrip(sep))
# "Dr. Strangelove or:\nHow I Learned to Stop Worrying and Love the Bomb", "O Brother, Where Art Thou?", "Who\'s Afraid of Virginia Woolf?", "В бой идут одни ""старики"""
print(df['Films'].to_json(orient='records', force_ascii=False))
# ["Dr. Strangelove or:\nHow I Learned to Stop Worrying and Love the Bomb","O Brother, Where Art Thou?","Who's Afraid of Virginia Woolf?","В бой идут одни \"старики\""]