如何更高效判断DataFrame中指定地点的金额是否全为0?
更高效的Pandas地点金额全零判断实现
问题背景
你有如下结构的Pandas DataFrame,包含location、product、amount三列:
import pandas as pd data = [['park', 'cookie', 2], ['park', 'muffin', 0], ['park', 'scone', 3], ['mall', 'cookie', 0], ['mall', 'muffin', 0], ['mall', 'scone', 0], ['store', 'cookie', 8]] df = pd.DataFrame(data, columns=['location', 'product', 'amount'])
需求是判断指定地点的所有amount是否全部为0,你当前的实现函数如下:
def location_has_nothing(loc): location_condition = df['location'] == loc amount_condition = df['amount'] != 0 df_filtered = df[location_condition][amount_condition] return df_filtered.empty
当传入loc='park'时返回False,传入loc='mall'时返回True,希望找到更高效的实现方式。
优化方案
这里提供几种更简洁高效的实现思路:
1. 直接用all()方法判断(最直观)
直接筛选指定地点的amount列,用all()方法检查所有值是否都为0,逻辑清晰且性能更优:
def location_has_nothing(loc): return (df[df['location'] == loc]['amount'] == 0).all()
2. 提前分组预处理(适合频繁查询场景)
如果需要多次查询不同地点的状态,建议提前按location分组聚合,生成状态映射字典,后续查询直接O(1)取值:
# 预处理生成地点状态字典 location_status = df.groupby('location')['amount'].apply(lambda x: (x == 0).all()).to_dict() # 查询函数 def location_has_nothing(loc): return location_status.get(loc, False) # 不存在的地点默认返回False,可按需调整
这种方式仅需一次分组计算,后续查询效率极高,适合批量查询场景。
3. 规范原逻辑的写法(避免警告)
你的原代码使用了链式索引df[location_condition][amount_condition],可能触发SettingWithCopyWarning,建议改为一次筛选的规范写法:
def location_has_nothing(loc): df_filtered = df[(df['location'] == loc) & (df['amount'] != 0)] return df_filtered.empty
这和原逻辑一致,但写法更严谨,避免潜在的警告问题。
内容的提问来源于stack exchange,提问作者meelszz
相关产品推荐
相关产品推荐

