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

Pandas中无法正确向DataFrame追加指定列数据的问题

问题描述

我有分钟级行情数据,按日期分组后尝试生成仅包含date和symbol的新DataFrame并追加到目标DataFrame时遇到两个问题:

  1. 使用append方法时,目标DataFrame始终为空,且该方法已被标记为废弃。
  2. 改用concat方法后,结果混入了原数据的所有列,而我只需要保留date和symbol列。

原始数据示例

index                  timestamp    open    high    low  ...  trade_count       vwap  symbol  cum_volume cum_volume_25k
    0       2021-11-02 13:30:00+00:00  2021-11-02 13:30:00+00:00  12.000  12.055  12.00  ...           62  12.003693    AMCR       47208              0
    1       2021-11-02 13:31:00+00:00  2021-11-02 13:31:00+00:00  12.040  12.070  12.04  ...          117  12.055675    AMCR       67656              0
    ...                           ...                        ...     ...     ...    ...  ...          ...        ...     ...         ...            ...
    429004  2022-10-21 22:44:00+00:00  2022-10-21 22:44:00+00:00  30.060  30.060  30.06  ...            1  30.060000    YETI      783148              0
    
    [429005 rows x 12 columns]

错误的分组与追加代码

错误的分组代码

df['timestamp'] = pd.to_datetime(df['timestamp'])
days = df.groupby(df['timestamp'].dt.normalize().unique())

错误的append用法(目标DataFrame为空)

data = pd.DataFrame()
for index, name in days:
    date = name['index'].values[0]
    symbol = name['symbol'].values[0]
    temp_data = pd.DataFrame({'date': date, 'symbol': symbol}, index=[0])
    data.append(temp_data, ignore_index=True)  # 未赋值给data,原data不变

错误的concat用法(混入多余列)

list_of_df = []
for index, name in days:
    list_of_df.append(name)  # 错误加入了原数据子集
    date = name['index'].values[0]
    symbol = name['symbol'].values[0]
    temp_data = pd.DataFrame({'date': date, 'symbol': symbol}, index=[0])
    list_of_df.append(temp_data)
print(pd.concat(list_of_df))

解决方案

方法一:直接提取唯一组合(最推荐,效率最高)

不需要分组循环,直接提取date和symbol的唯一记录:

import pandas as pd

# 将timestamp转换为日期格式(去掉时分秒)
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['date'] = df['timestamp'].dt.normalize()

# 提取date和symbol的唯一组合,重置索引
result = df[['date', 'symbol']].drop_duplicates().reset_index(drop=True)

方法二:正确分组+concat(适合需要额外分组操作的场景)

先修正分组逻辑,再仅将目标列的临时DataFrame加入列表:

import pandas as pd

df['timestamp'] = pd.to_datetime(df['timestamp'])
# 按日期(归一化后的timestamp)和symbol分组,确保每个组对应唯一的日期+symbol
groups = df.groupby([df['timestamp'].dt.normalize(), 'symbol'])

list_of_df = []
for (date, symbol), _ in groups:
    # 仅创建包含目标列的临时DataFrame
    temp_df = pd.DataFrame({'date': [date], 'symbol': [symbol]})
    list_of_df.append(temp_df)

# 合并所有临时DataFrame,忽略原索引
result = pd.concat(list_of_df, ignore_index=True)

错误原因说明

  1. append方法问题:append不会修改原DataFrame,而是返回新对象,需将结果赋值给原变量(且该方法已废弃,不推荐使用)。
  2. 分组代码错误:groupby(df['timestamp'].dt.normalize().unique())是无效的分组方式,应直接使用分组键(日期+symbol)进行分组。
  3. concat错误:之前的代码将原数据的子集(name)加入了列表,导致最终结果混入多余列,只需加入生成的目标列临时DataFrame即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:01:24