Python入门问题:DataFrame转字符串行时单条数据异常
问题解决:单行数据时Service Bus发送异常的修复
问题根源
你的代码核心问题在于df.squeeze()的行为不一致:
- 当DataFrame有多行时,
squeeze()返回Series对象,遍历其items会得到每行的索引与对应数据(此时刚好符合你的预期) - 当DataFrame只有一行时,
squeeze()会直接返回单个字符串/标量值,此时遍历这个值会默认拆分为单个字符,导致逐字符发送的错误。
你尝试的df.squeeze().count()报错,是因为单行squeeze后得到的是numpy标量(如numpy.int64),它没有count()方法,只有Series对象才具备该方法。
修复方案
1. 统一遍历逻辑(适配单行/多行场景)
直接遍历DataFrame的行,避免依赖squeeze()的不稳定行为。同时将ServiceBus客户端的创建移到循环外,减少重复建立连接的资源开销:
from ayx import Alteryx from azure.servicebus import ServiceBusClient, ServiceBusMessage import json connstr = "xxxxx" queue_name = "invoicedk" df = Alteryx.read("#1") print(df) # 提前创建ServiceBus客户端和发送者,避免循环内重复初始化 with ServiceBusClient.from_connection_string(connstr) as client: with client.get_queue_sender(queue_name) as sender: # 遍历DataFrame的每一行 for _, row in df.iterrows(): # 将行数据转换为JSON字符串(适用于Alteryx已解析JSON为多列的场景) json_str = json.dumps(row.to_dict()) single_message = ServiceBusMessage(json_str) sender.send_messages(single_message)
2. 单列原始JSON场景的简化处理
如果你的DataFrame是单列存储原始JSON字符串(即Alteryx未解析JSON,每行是完整的JSON文本),可以直接遍历列元素:
from ayx import Alteryx from azure.servicebus import ServiceBusClient, ServiceBusMessage connstr = "xxxxx" queue_name = "invoicedk" df = Alteryx.read("#1") print(df) with ServiceBusClient.from_connection_string(connstr) as client: with client.get_queue_sender(queue_name) as sender: # 遍历单列的每个JSON字符串 for json_str in df.iloc[:, 0]: single_message = ServiceBusMessage(json_str) sender.send_messages(single_message)
关键优化点
- 减少连接开销:将ServiceBus客户端和发送者的创建放在循环外,避免重复建立连接
- 统一行为逻辑:用
iterrows()或直接遍历列元素,确保单行、多行数据的处理逻辑一致 - 明确数据转换:如果需要将行数据转为JSON字符串,用
json.dumps(row.to_dict())保证格式合法性
内容的提问来源于stack exchange,提问作者Dennis Schlein
相关产品推荐
相关产品推荐

