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

Pandas中莫名出现的new_inf_day列致测试失败,如何移除?

问题解答:彻底移除临时列new_inf_day

1. new_inf_day列是什么?

它是你代码中创建的临时辅助列,作用是对原数据的day列做转换:

  • 对于name为A或B的行,直接沿用day的值;
  • 对于其他name的行,将值替换为max_bin + 1(也就是7);
  • 后续用来配合pd.cut完成分组统计。

2. 为什么会出现“打印看不到但调试/测试有相关信息”的情况?

你返回的ans是分组聚合后的结果,本身确实不包含new_inf_day列,所以打印时看不到。但问题出在:你直接在传入的原始df上新增了这个列,导致原始df被修改——单元测试大概率依赖原始df的结构或数据,这才是测试失败的根源,调试窗口看到的也是原始df里的这个列。

3. 彻底移除的两种方法

方法一:使用临时副本,不修改原始df

创建原始df的副本,在副本上操作临时列,完全避免污染原始数据:

df: pd.DataFrame = kwargs['df']
max_bin = 6
bins = [x for x in range(0, max_bin + 1)]

# 创建临时副本,所有操作在副本上进行
temp_df = df.copy()
temp_df['new_inf_day'] = temp_df['day']
temp_df.loc[~temp_df['name'].isin(['A', 'B']), 'new_inf_day'] = max_bin + 1

ans = temp_df.groupby(['id', pd.cut(temp_df['new_inf_day'], bins=bins)]).size().unstack()

new_name = {}
for old_col, index in zip(ans.columns.tolist(), bins[1:]):
    new_name[old_col] = f'name_{index - 1}_to_{index}'

ans.rename(columns=new_name, inplace=True)
return ans.reset_index('id')

方法二:操作完后从原始df中删除临时列

如果必须在原始df上操作,分组完成后立即删除新增的临时列:

df: pd.DataFrame = kwargs['df']
max_bin = 6
bins = [x for x in range(0, max_bin + 1)]

df['new_inf_day'] = df['day']
df.loc[~df['name'].isin(['A', 'B']), 'new_inf_day'] = max_bin + 1

ans = df.groupby(['id', pd.cut(df['new_inf_day'], bins=bins)]).size().unstack()

# 从原始df中彻底删除临时列
df.drop('new_inf_day', axis=1, inplace=True)

new_name = {}
for old_col, index in zip(ans.columns.tolist(), bins[1:]):
    new_name[old_col] = f'name_{index - 1}_to_{index}'

ans.rename(columns=new_name, inplace=True)
return ans.reset_index('id')

关键提示

单元测试失败的核心原因是传入的原始DataFrame被意外修改,建议优先使用方法一,因为它不会对原始数据产生任何副作用,更符合函数式编程的规范,也能避免后续其他逻辑受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:37:33