Создание одноколоночного фрейма данных в 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.