如何高效向DataFrame添加行?附含主键的历史定价数据集片段
高效向带复合主键的DataFrame添加行的方法
嘿,针对你这个要给以(id, p_date)为复合主键的DataFrame高效添加行的需求,我整理了几个亲测好用的方案——毕竟之前踩过逐行添加的大坑,效率差到离谱,所以重点说高效的批量方法:
1. 批量添加首选:pd.concat(效率最高)
Pandas里绝对不要循环用df.append()逐行添加,因为DataFrame是不可变对象,每次append都会生成新的DataFrame,数据量稍大就会卡到崩溃。正确姿势是把要添加的所有行先整理成新的DataFrame,再用concat合并,最后去重保证主键唯一:
import pandas as pd # 假设你的原DataFrame是original_df # 先准备好要添加的新数据(可以是列表字典、另一个DataFrame) new_rows = [ {"id": "038af19179925da21a25619c5a24b745", "p_date": "2015-04-01", "price": 99.9}, {"id": "new_customer_001", "p_date": "2024-05-01", "price": 129.9}, {"id": "new_customer_002", "p_date": "2024-05-01", "price": 89.9} ] new_df = pd.DataFrame(new_rows) # 合并原数据和新数据,同时根据复合主键去重,保留最新的行(如果有重复) combined_df = pd.concat([original_df, new_df]).drop_duplicates(subset=["id", "p_date"], keep="last") # 如果需要替换原DataFrame,直接赋值即可 original_df = combined_df
2. 少量单行添加:用df.loc直接赋值
如果只是偶尔添加1-2行,也可以用loc直接定位到新行的位置赋值,但记得先校验主键是否存在,避免重复:
# 定义要添加的单行数据 new_row = {"id": "new_customer_003", "p_date": "2024-06-01", "price": 109.9} # 先检查复合主键是否已存在 is_duplicate = ((original_df["id"] == new_row["id"]) & (original_df["p_date"] == new_row["p_date"])).any() if not is_duplicate: original_df.loc[len(original_df)] = new_row else: print("该主键组合已存在,跳过添加")
3. 超大数据量场景:用Dask并行处理
如果要添加的行达到百万级甚至更多,内存不够用的话,可以用dask.dataframe来并行处理,它能分块加载数据,避免内存溢出:
import dask.dataframe as dd # 把原DataFrame转成Dask DataFrame ddf = dd.from_pandas(original_df, npartitions=4) # 新数据也转成Dask DataFrame new_ddf = dd.from_pandas(new_df, npartitions=1) # 合并并去重 combined_ddf = dd.concat([ddf, new_ddf]).drop_duplicates(subset=["id", "p_date"], keep="last") # 转回Pandas DataFrame(如果需要的话) original_df = combined_ddf.compute()
额外注意事项
- 统一日期格式:把
p_date列转成datetime类型,避免后续出现格式问题:original_df["p_date"] = pd.to_datetime(original_df["p_date"]) - 列名一致性:新添加的行要和原DataFrame列名完全一致,否则会出现
NaN值 - 主键唯一性校验:无论用哪种方法,都要确保添加后
(id, p_date)没有重复,否则会破坏数据集的主键规则
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

