如何基于另一列条件遍历列表填充Pandas DataFrame列?
解决方案
先理清你的代码错误原因
你用np.where时只传了判断条件,没给出满足/不满足条件对应的赋值内容,所以触发ValueError;另外isin([fiscal_months])逻辑完全错误——isin是用来检查元素是否在离散值集合里,没法匹配日期区间,这两个问题导致代码跑不通。
针对20万+行数据的高效处理方案
下面两种方法都适配大样本量,选哪种看你fiscal_months的具体结构:
方法1:用pd.cut(推荐,速度最快)
假设你的fiscal_months是**(起始日期, 结束日期, 财月标签)**的元组列表,比如:
fiscal_months = [ ("2022-05-01", "2022-05-31", "FY22-05"), ("2022-06-01", "2022-06-30", "FY22-06"), # ... 剩余22个财月 ("2023-04-01", "2023-04-30", "FY23-04") ]
执行步骤:
- 先把
Creation Date转成datetime类型(如果还没转):
mfg_df["Creation Date"] = pd.to_datetime(mfg_df["Creation Date"])
- 提取财月边界和标签:
# 提取所有财月的起始日期作为分箱左边界 bounds = [pd.to_datetime(start) for start, end, label in fiscal_months] # 加上最后一个财月结束日期+1天作为右边界,确保所有日期都能被匹配 bounds.append(pd.to_datetime(fiscal_months[-1][1]) + pd.Timedelta(days=1)) # 提取财月标签 labels = [label for start, end, label in fiscal_months]
- 用
pd.cut生成财月列:
mfg_df["Fiscal Month"] = pd.cut( mfg_df["Creation Date"], bins=bounds, labels=labels, right=False # 左闭右开区间,对应日期>=起始日且<下一个起始日,可根据你的财历规则调整 )
方法2:用np.select(逻辑更直观)
如果需要明确判断日期是否在每个财月的闭区间内,可以用这个方法:
- 先转
Creation Date为datetime类型(同上) - 构建匹配条件和对应标签:
conditions = [] choices = [] for start, end, label in fiscal_months: start_dt = pd.to_datetime(start) end_dt = pd.to_datetime(end) # 生成当前财月的匹配条件:日期在[start_dt, end_dt]之间 cond = (mfg_df["Creation Date"] >= start_dt) & (mfg_df["Creation Date"] <= end_dt) conditions.append(cond) choices.append(label)
- 批量匹配赋值:
# 给不在财历范围内的日期设置默认值,比如"Unknown" mfg_df["Fiscal Month"] = np.select(conditions, choices, default="Unknown")
注意事项
- 如果你的
fiscal_months里存的是pd.date_range对象,直接用fm.start_date和fm.end_date提取起止日期即可 - 确保所有日期范围没有重叠,否则会导致匹配结果混乱
内容的提问来源于stack exchange,提问作者Stuck
相关产品推荐
相关产品推荐

