使用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
相关产品推荐
相关产品推荐

