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

使用if条件创建新pandas DataFrame触发ValueError问题求解

报错原因
  • 你的if判断中直接传入了df[df['month']==i]这类DataFrame切片对象,这类对象没有默认的布尔值,Python无法判断它的真假,所以抛出歧义错误。判断过滤结果是否存在数据要使用.empty属性返回的布尔值。
  • pandas的多条件过滤不能用Python原生的and,需要用位运算符&,且每个判断条件需要用括号包裹,否则会触发运算优先级错误。
  • 原代码里的df.series是无效语法,无法提取符合条件的行数据,且直接赋值会覆盖之前的结果,不会累积每个月的数据。
正确实现方案

建议按年月分组处理,避免不同年份的同月数据混淆,优先取目标日期,不存在再取备选日期:

import pandas as pd

# 先把日期列转为标准datetime格式,提取年、月、日字段
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day

new_df = pd.DataFrame()
# 按年月分组遍历
for (year, month), group_df in df.groupby(['year', 'month']):
    # 优先取当月5号的数据
    target_data = group_df[group_df['day'] == 5]
    if not target_data.empty:
        new_df = pd.concat([new_df, target_data], ignore_index=True)
        continue
    # 5号不存在则取6号
    target_data = group_df[group_df['day'] == 6]
    if not target_data.empty:
        new_df = pd.concat([new_df, target_data], ignore_index=True)
    # 若要增加更多备选日期,继续向下加判断逻辑即可

如果需要更高效的向量化写法,不用循环,可以用优先级标记法:

# 给目标日期设置优先级,数值越小优先级越高
df['priority'] = df['day'].map({5: 1, 6: 2})
# 过滤出候选日期,按优先级排序后每组取第一条
new_df = (
    df[df['day'].isin([5, 6])]
    .sort_values('priority')
    .groupby(['year', 'month'], as_index=False)
    .head(1)
    .drop('priority', axis=1)
)

内容的提问来源于stack exchange,提问作者Marvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:24:03