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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:01:01