Pandas中无法正确向DataFrame追加指定列数据的问题
问题描述
我有分钟级行情数据,按日期分组后尝试生成仅包含date和symbol的新DataFrame并追加到目标DataFrame时遇到两个问题:
- 使用
append方法时,目标DataFrame始终为空,且该方法已被标记为废弃。 - 改用
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)
错误原因说明
- append方法问题:
append不会修改原DataFrame,而是返回新对象,需将结果赋值给原变量(且该方法已废弃,不推荐使用)。 - 分组代码错误:
groupby(df['timestamp'].dt.normalize().unique())是无效的分组方式,应直接使用分组键(日期+symbol)进行分组。 - concat错误:之前的代码将原数据的子集(
name)加入了列表,导致最终结果混入多余列,只需加入生成的目标列临时DataFrame即可。
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

