如何使用asyncio实现DataFrame两列的除法运算?
解决asyncio处理DataFrame除法运算的TypeError问题
错误原因
你错误地给同步的Pandas Series运算加了await关键字。await只能用于可等待对象(协程、Task、Future等),而data['total']/data['num2']返回的是Pandas Series,属于同步计算结果,不是可等待对象。Python尝试将其当作可等待对象处理时,会触发unhashable type: 'Series'错误。
正确处理方式
Pandas的数值运算属于CPU密集型操作,asyncio本身更适合处理IO密集型任务。如果非要用asyncio封装,需要把同步运算放到线程池(或进程池)中执行,避免阻塞事件循环:
Python 3.9+ 写法(推荐)
import asyncio import pandas as pd async def divis(data): # 将同步运算委托给线程池执行 result = await asyncio.to_thread(lambda: data['total'] / data['num2']) data['prom'] = result return data # 调用示例 async def main(): df2 = pd.DataFrame({'total': [10, 20, 30], 'num2': [2, 4, 5]}) df_result = await divis(df2) print(df_result) asyncio.run(main())
Python 3.8及以下写法
import asyncio import pandas as pd import concurrent.futures async def divis(data): loop = asyncio.get_running_loop() with concurrent.futures.ThreadPoolExecutor() as pool: # 在线程池中执行同步运算 result = await loop.run_in_executor(pool, lambda: data['total'] / data['num2']) data['prom'] = result return data # 调用示例 async def main(): df2 = pd.DataFrame({'total': [10, 20, 30], 'num2': [2, 4, 5]}) df_result = await divis(df2) print(df_result) asyncio.run(main())
额外提示
如果你的场景没有IO操作(比如网络请求、文件读写),单纯的DataFrame运算用同步写法效率更高,不需要强行用asyncio,反而会增加线程调度的开销。
内容的提问来源于stack exchange,提问作者YOU
相关产品推荐
相关产品推荐

