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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:52:49