Pandas drop()方法无法删除列:循环内外表现不一致求助
问题诊断:循环变量赋值未同步到原列表
我一眼就看出核心问题了:你在循环里做的i = i.drop('datetime', axis=1)只是让局部变量i指向了一个新的DataFrame实例,但原列表augmenting_dfs里的原始元素完全没被修改。
为啥会这样?当你遍历augmenting_dfs时,i只是列表中每个DataFrame的临时引用。一旦你执行i = ...,这个变量就会指向新的对象,和原列表里的那个DataFrame彻底脱钩了——这就是为啥循环内打印显示列被删除,但循环外访问原列表时,datetime列又回来了。
解决方案
这里给你两种靠谱的修正方式,按需选择:
方式1:通过索引直接修改原列表
遍历列表的索引,直接把修改后的DataFrame放回原列表的对应位置:
t_start_pd = time.time() # 遍历索引而非元素,直接操作原列表 for idx in range(len(augmenting_dfs)): df = augmenting_dfs[idx] # 原有的列格式化逻辑 if df.shape[1] == 7: df['symbol'] = symbol df = df.loc[:, ['symbol', 'Date', 'Time', 'Open', 'High', 'Low', 'Close', 'TotalVolume']] df.columns = ['symbol', 'price_date', 'price_time', 'price_open', 'price_high', 'price_low', 'price_close', 'volume'] print('Columns formatted.') # datetime处理逻辑 df['datetime'] = pd.to_datetime(df.price_date.astype('str') + ' ' + df.price_time.astype('str')) print('datetime formatted') df.index = df.datetime df = df.drop('datetime', axis=1) # 关键:把修改后的DataFrame放回原列表 augmenting_dfs[idx] = df t_end_pd = time.time() print(t_end_pd - t_start_pd)
方式2:用列表推导式生成新列表(更Pythonic)
把DataFrame的处理逻辑封装成函数,用列表推导式直接生成包含所有修改后对象的新列表,再覆盖原列表:
def process_dataframe(df): # 列格式化逻辑 if df.shape[1] == 7: df['symbol'] = symbol df = df.loc[:, ['symbol', 'Date', 'Time', 'Open', 'High', 'Low', 'Close', 'TotalVolume']] df.columns = ['symbol', 'price_date', 'price_time', 'price_open', 'price_high', 'price_low', 'price_close', 'volume'] print('Columns formatted.') # datetime处理逻辑 df['datetime'] = pd.to_datetime(df.price_date.astype('str') + ' ' + df.price_time.astype('str')) print('datetime formatted') df.index = df.datetime return df.drop('datetime', axis=1) # 生成新列表并覆盖原变量 t_start_pd = time.time() augmenting_dfs = [process_dataframe(df) for df in augmenting_dfs] t_end_pd = time.time() print(t_end_pd - t_start_pd)
额外小贴士
- 你之前尝试列表推导式没成功,大概率是忘了把生成的新列表赋值回
augmenting_dfs——光写推导式不覆盖原变量,原列表当然不会变。 - 如果你想尝试原地修改(不创建新对象),可以用
df.drop('datetime', axis=1, inplace=True),但要注意inplace=True在链式操作中可能引发意外,而且Pandas官方也更推荐返回新对象的写法,所以优先考虑上面两种方案。
内容的提问来源于stack exchange,提问作者pmse234
相关产品推荐
相关产品推荐

