Python DataFrame循环与切片问题排查及代码解析
搞定DataFrame循环与切片的优化问题
嘿,看你的代码是想做个简单的聊天交互,识别问候和告别语对吧?目前check_for_greet函数的循环逻辑没写完,而且如果用传统的逐元素循环遍历DataFrame,不仅代码啰嗦,效率还低——毕竟pandas的强项就是向量式操作,完全不用手动挨个遍历。
优化方案:用向量操作替代低效循环
我给你完善并优化了代码,核心思路是把DataFrame里的问候/告别语转成集合(查找速度快),同时简化循环逻辑:
import random import re import pandas as pd # 初始化你的数据 df1 = pd.DataFrame({"Greetings": ["Greetings to you too", "hi", "hello", "hey", "greetings", "sup", "what's up", "yo"]}) df2 = pd.DataFrame({"Farewell": ["GoodBye", "see you", "bye", "laters"]}) df3 = pd.concat([df1, df2], axis=1, join='outer', copy=True) # 把问候语和告别语转成小写集合,方便快速匹配 greetings = set(df1['Greetings'].str.lower()) farewells = set(df2['Farewell'].str.lower()) def check_for_greet(): while True: try: sentence = input("Start chatting: ").strip().lower() # 终止条件 if sentence == "$$$": print("聊天结束啦!") return "END" # 先匹配整句 if sentence in greetings: print("收到你的问候啦!") print(f"回复:{random.choice(df1['Greetings'].tolist())}") elif sentence in farewells: print("收到你的告别啦!") print(f"回复:{random.choice(df2['Farewell'].tolist())}") else: # 拆分单词匹配关键词 word_list = re.sub("[^\w]", " ", sentence).split() has_greet = any(word in greetings for word in word_list) has_farewell = any(word in farewells for word in word_list) if has_greet: print("识别到问候关键词啦!") print(f"回复:{random.choice(df1['Greetings'].tolist())}") elif has_farewell: print("识别到告别关键词啦!") print(f"回复:{random.choice(df2['Farewell'].tolist())}") else: print("我不太明白你说的是什么😅") except Exception as e: print(f"哎呀,出了点小问题:{e}") continue # 启动聊天 check_for_greet()
为什么这么改?
- 告别低效循环:集合的查找速度是O(1),比你原来可能要写的嵌套循环(遍历输入单词→再遍历DataFrame每一行)快太多,尤其是数据量变大时差距更明显。
- 逻辑更清晰:保留了你原来的
while True循环,但内部用批量匹配替代了冗余的手动遍历,代码读起来更顺。 - 两种匹配模式:既支持整句精准匹配(比如输入"hello"直接命中),也支持关键词模糊匹配(比如输入"hey man"也能识别问候)。
如果真的需要遍历/切片DataFrame(特殊场景)
要是因为某些特殊需求必须手动遍历,推荐用itertuples()或者iterrows(),比直接用for循环索引高效:
# 示例:用itertuples遍历问候语列 for row in df1.itertuples(): current_greet = row.Greetings.lower() # 这里写你的匹配逻辑
切片的话直接用索引就行,比如取前3条问候语:
top3_greets = df1['Greetings'][:3].tolist() # 对这部分数据做处理
小提醒
能用pandas自带的向量操作(比如str.lower()、isin()、str.contains())就别手动循环,这是用pandas的基本准则,性能和代码简洁度都能提升一大截!
内容的提问来源于stack exchange,提问作者Muke888
相关产品推荐
相关产品推荐

