You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Django QuerySet创建单列Pandas DataFrame的高效方案

问题

我想把Django模型里的两个字段(示例为description、comments)的内容合并到Pandas的单列DataFrame中。目前我是先把数据写入CSV文件再读取的方式实现,但处理大数据集时效率很低,想去掉CSV中转步骤,找更高效的方法。现有实现代码如下:

# 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)  

高效实现方案

直接从Django QuerySet提取数据构造DataFrame,跳过CSV中转,实现代码如下:

import pandas as pd
from django.db.models import Q

# 定义目标字段
field_names = ["description", "comments"]

# 从QuerySet批量提取数据(可选过滤至少一个字段非空的记录,按需取舍)
queryset = Order.objects.filter(
    Q(description__isnull=False) | Q(comments__isnull=False)
).values_list(*field_names)

# 构造DataFrame并设置列名
df = pd.DataFrame(queryset, columns=field_names)

# 合并列:过滤每行空值后用逗号连接
df_combined = df.apply(lambda row: ", ".join(row.dropna()), axis=1)

# 若需要转为带列名的DataFrame,可执行以下操作
# df_combined = pd.DataFrame(df_combined, columns=["combined_content"])

优化点说明

  • 避免循环遍历开销:用values_list从数据库批量拉取目标字段数据,比逐个遍历Order.objects.all()效率提升显著,尤其适配大数据集场景。
  • 消除磁盘IO损耗:全程在内存中完成数据转换,跳过写入/读取CSV的磁盘操作,大幅提升处理速度。
  • 空值处理更简洁:通过row.dropna()直接过滤空值,逻辑清晰且代码更简洁。

内容的提问来源于stack exchange,提问作者rustyshackleford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:45:31