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

