检查pandas dataframe中是否存在指定日期,缺失则追加到表末
错误原因
pd.DataFrame.append()方法本身不支持原位修改,调用后会返回新的DataFrame对象,原对象不会被修改,你的代码没有接收返回值,所以追加操作没有生效。- 循环遍历的
idx变量没有提前定义,你实际生成的比对基准是dateRange,应该遍历该变量才对。 - 所有的追加操作都作用在新建的
df变量上,但最后打印的是原dftickets,自然看不到修改结果。 - 你已经给原表插入了
Data列,此时表的总列数是48(原47列+1列新列),追加时用[0]*47会导致列数不匹配。 - append传入纯列表的格式不符合要求,pandas无法正确识别为一行数据,会拆成多行异常值。
修复方案
pandas 1.4及以上版本已经正式弃用DataFrame.append()方法,官方推荐使用pd.concat()完成多行拼接,效率远高于循环append,适配你需求的代码如下:
import pandas as pd # 1. 生成日期列,和原有逻辑保持一致 dftickets.insert(0, 'Data', dftickets['created_at'].apply(lambda x: pd.Timestamp(x).strftime('%Y-%m-%d'))) # 2. 生成基准日期范围 date_range = pd.date_range('2021-08-01', '2021-08-31').strftime('%Y-%m-%d') # 3. 找出缺失的日期(自动去重原表的重复日期后比对) exist_dates = dftickets['Data'].unique() missing_dates = [d for d in date_range if d not in exist_dates] # 4. 构造缺失日期的行,非日期列统一填0 missing_df = pd.DataFrame(missing_dates, columns=['Data']) for col in dftickets.columns: if col != 'Data': missing_df[col] = 0 # 5. 把缺失行拼接回原表,重置索引避免索引重复 dftickets = pd.concat([dftickets, missing_df], ignore_index=True) print(dftickets)
内容的提问来源于stack exchange,提问作者GuiAT
相关产品推荐
相关产品推荐

