从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
相关产品推荐
相关产品推荐

