Создание одноколоночного фрейма данных в Pandas из кверисета Django

Я пытаюсь создать фрейм данных, содержащий значения из field_1 и field_2 в одном столбце. Я не часто использовал pandas раньше, поэтому я уверен, что это наивно.

# Create a dataset in CSV format
field_names = ["description", "comments"]
writer = csv.writer(open("dataset.csv", "w"), quoting=csv.QUOTE_ALL, delimiter=",")
writer.writerow(field_names)
for instance in Order.objects.all():
    writer.writerow([str(getattr(instance, f)) for f in field_names])

# Read CSV
data_frame = pd.read_csv("dataset.csv", index_col=0)
# Combine columns
df2 = data_frame.apply(lambda x: ", ".join(x[x.notnull()]), axis=1)  

Если я работаю с довольно большим набором данных, есть ли способ сделать это более эффективным? Я бы хотел полностью исключить этап создания CSV, если это возможно. Если кто-нибудь может указать мне правильное направление, это было бы замечательно.

Вам действительно не нужно:

  • объекты заказа и getattr; используйте .values_list() для получения итерабельной таблицы из двух кортежей (предполагается, что field_names являются реальными полями в модели).
  • CSV - теперь, когда у вас есть итерабель из двух кортежей, передайте их конструктору DataFrame вместе с именами соответствующих столбцов.
field_names = ["description", "comments"]
df = pd.DataFrame.from_records(
  Order.objects.all().values_list(field_names),
  columns=field_names,
)
  • Необходимо даже пандам
from django.db.models import F, Value
from django.db.models.functions import Concat

# ... 
my_data = list(
    Order.objects.annotate(
        x=Concat(
            F("description"),
            Value(", "),
            F("comments"),
        )
    ).values_list("x", flat=True)
)

и у вас есть список строк description, comments, подобно серии, которую вы получили бы с помощью Pandas.

Вернуться на верх