如何在DataFrame中基于datetime匹配快速新增APL_price列?
高效实现Pandas新增匹配APL价格列的方法
嘿,完全不用写遍历函数!Pandas的向量化操作比手动循环高效太多了,这里有两种简洁的方案帮你搞定需求:
首先先还原你的示例数据:
import pandas as pd data = { 'name': ['APL', 'BBC', 'CPL', 'APL', 'BBC', 'CPL'], 'datetime': ['10-1-12', '10-1-12', '10-1-12', '10-2-12', '10-2-12', '10-2-12'], 'price': [1.92, 4.16, 4.99, 2.05, 5.16, 3.99] } df = pd.DataFrame(data)
方法一:用map快速映射(最简洁)
先提取APL的日期-价格映射关系,然后直接用datetime列去匹配:
# 构建APL的日期到价格的字典 apl_price_map = df[df['name'] == 'APL'].set_index('datetime')['price'].to_dict() # 新增APL_price列 df['APL_price'] = df['datetime'].map(apl_price_map)
这样运行后,所有相同datetime的行都会自动匹配到对应APL的价格,APL自身的行也会显示自己的价格。如果想要把APL自身的APL_price设为null,只需要再加一行:
import numpy as np df.loc[df['name'] == 'APL', 'APL_price'] = np.nan
方法二:用merge左连接(更灵活)
如果后续有更多关联需求,用合并的方式扩展性更强:
# 提取APL的日期和价格数据,重命名列 apl_df = df[df['name'] == 'APL'][['datetime', 'price']].rename(columns={'price': 'APL_price'}) # 按datetime左连接原DataFrame df = df.merge(apl_df, on='datetime', how='left')
这种方法同样能实现需求,而且如果以后需要关联更多列,直接修改apl_df的列即可。
为什么这两种方法比遍历高效?
Pandas的map和merge都是底层优化的向量化操作,避免了Python层面的循环,处理大数据量时速度会比手动遍历快几十甚至上百倍,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者Danny W
相关产品推荐
相关产品推荐

