循环迭代Pandas DataFrame时,如何将Azure OpenAI响应写入已有列
循环迭代Pandas DataFrame时,如何将Azure OpenAI响应写入已有列
嗨,我看了你遇到的问题,核心是误用了insert()方法——这个函数是用来新增一列的,而你需要的是更新已有列里对应行的值,难怪会报错说列已经存在啦。
咱们直接修改你的循环代码就行,用loc来定位当前行的AI Response列,把OpenAI的响应赋值过去就好:
import time import pandas as pd import openai # 假设你已经正确加载了df_descriptions for index, row in df_descriptions.iterrows(): # 注意列名大小写要和DataFrame里的一致,你的列名是Description(首字母大写) prompt = row['Description'] response = openai.ChatCompletion.create( engine="gpt-35-turbo", messages=[ {"role": "system", "content": "You are an AI assistant"}, {"role": "user", "content": prompt}, ], temperature=0.3, max_tokens=1000, top_p=0.95, frequency_penalty=0, presence_penalty=0, stop=None, ) # 关键修改:用loc定位当前行的AI Response列,直接赋值覆盖NaN df_descriptions.loc[index, 'AI Response'] = response.choices[0].message.content print(df_descriptions['AI Response']) time.sleep(5)
为什么这样可行?
iterrows()每次循环会返回当前行的index(行索引)和row(行数据),用df.loc[index, '列名']就能精准定位到你要更新的单元格,直接赋值就会替换原来的NaN值。- 全程只是修改已有列的内容,不会触发列重复创建的问题,完美匹配你的需求。
小细节提醒
你原代码里写的是row['description'],但你的DataFrame列名是Description(首字母大写),这里一定要注意大小写一致,不然会取不到提示文本哦!
如果之后你的数据量变大,iterrows()的效率可能不够理想,那时候可以考虑用apply函数批量处理,但目前你的场景下,iterrows()搭配loc的写法简单直观,完全够用。
备注:内容来源于stack exchange,提问作者pg.lopes
相关产品推荐
相关产品推荐

