You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一列条件遍历列表填充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")
]

执行步骤:

  1. 先把Creation Date转成datetime类型(如果还没转):
mfg_df["Creation Date"] = pd.to_datetime(mfg_df["Creation Date"])
  1. 提取财月边界和标签:
# 提取所有财月的起始日期作为分箱左边界
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]
  1. 用pd.cut生成财月列:
mfg_df["Fiscal Month"] = pd.cut(
    mfg_df["Creation Date"],
    bins=bounds,
    labels=labels,
    right=False  # 左闭右开区间,对应日期>=起始日且<下一个起始日,可根据你的财历规则调整
)

方法2:用np.select(逻辑更直观)

如果需要明确判断日期是否在每个财月的闭区间内,可以用这个方法:

  1. 先转Creation Date为datetime类型(同上)
  2. 构建匹配条件和对应标签:
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)
  1. 批量匹配赋值:
# 给不在财历范围内的日期设置默认值,比如"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:47:41