使用df.at[] +=x给DataFrame单元格增量报错且astype转类型不生效如何解决
问题修复方案
错误根源
- pandas的
astype()方法不属于原地操作,仅会返回类型转换后的新序列,你没有将转换结果赋值回原列,因此年份列始终是字符串类型,执行+=1操作时会触发字符串拼接的类型错误 - 初始化年份列时你直接赋值了字符串格式的
"0",属于不必要的操作,直接用整数0初始化就可以从根源规避类型问题
最快修复方法
直接修改年份列的初始化逻辑,替换掉字符串0,删除无效的类型转换行即可:
for y in unique_years: missing_days_df = pd.DataFrame({'Days': ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']}) # 直接用整数0初始化列,不要加引号 missing_days_df[y] = 0 gold_days_year = pd.to_datetime(dates[dates.dt.year == y]) normal_days_year = pd.date_range(start=gold_days_year[0], end=gold_days_year.iloc[-1], freq='D') missing_for_year = pd.to_datetime(normal_days_year[~normal_days_year.isin(gold_days_year)]) week_days = pd.Series(missing_for_year.day_name()) for x in week_days: k = missing_days_df[missing_days_df['Days'] == x].index.tolist() k = int(k[0]) missing_days_df.at[k, y] += 1
可选优化写法
可以用内置的统计方法替代嵌套循环,代码更简洁执行效率更高:
for y in unique_years: # 初始化周几基表 missing_days_df = pd.DataFrame({'Days': ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']}) # 计算当年缺失日期的周几分布 gold_days_year = pd.to_datetime(dates[dates.dt.year == y]) normal_days_year = pd.date_range(start=gold_days_year.iloc[0], end=gold_days_year.iloc[-1], freq='D') weekday_count = pd.Series(normal_days_year[~normal_days_year.isin(gold_days_year)].day_name()).value_counts() # 直接映射赋值填充 missing_days_df[y] = missing_days_df['Days'].map(weekday_count).fillna(0).astype(int)
内容的提问来源于stack exchange,提问作者JacobMarlo
相关产品推荐
相关产品推荐

