如何自动筛选玉米种植月份的DataFrame?解决isin仅取首元素问题
解决方法
高效矢量化筛选(推荐)
完全不需要循环,Pandas的矢量化操作比循环高效几个数量级,尤其适合大数据量场景。直接用between方法或者布尔索引就能实现需求:
import pandas as pd # 方法1:使用between,自动处理l和m的大小顺序 filtered_df = df_area[df_area["Month"].between(min(l, m), max(l, m))] # 方法2:直接用布尔逻辑,效果相同 filtered_df = df_area[(df_area["Month"] >= min(l, m)) & (df_area["Month"] <= max(l, m))]
原代码问题分析
你之前的循环代码之所以只拿到单个月份的数据,是因为每次循环都重新赋值mask变量,覆盖了之前的结果。比如循环到k=3时,mask会被替换成仅包含3月的数据,之前k=2的结果完全丢失。
如果非要用循环(不推荐,仅作原理演示),需要把每次筛选的结果累加:
# 初始化空DataFrame存储结果 filtered_df = pd.DataFrame() start = min(l, m) end = max(l, m) for k in range(start, end + 1): # 筛选当前月份的行 temp = df_area[df_area["Month"] == k] # 追加到结果中 filtered_df = pd.concat([filtered_df, temp], ignore_index=True)
但这种方法在数据量大时会非常慢,因为concat是O(n)操作,多次调用会导致性能急剧下降,所以优先用前面的矢量化方法。
内容的提问来源于stack exchange,提问作者Endalkachew Kebede
相关产品推荐
相关产品推荐

