Вывод отфильтрованных данных из таблицы в виде строки

Работаю с библиотекой 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>>>'

→ Ссылка
Автор решения: Vitalizzare ушел в монастырь

Использование конкатенации в виде pandas.Series.str.cat или str.join подходит не всегда. Рассмотрим контекст: из таблицы Excel загружаются данные о фильмах, мы отбираем часть названий из поля "Films" и используем их в виде одной строки, соединив через запятую. Опираясь на свою практику, я бы учёл следующее:

  1. В названии могут быть запятые, одинарные и двойные кавычки.
  2. При заполнении таблицы могут быть вставлены принудительные разрывы строк.
  3. Если это база телевизионных или ютубовских сюжетов, то их названия непредсказуемы.

Пример выборки:

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?","В бой идут одни \"старики\""]
→ Ссылка