如何优化多DataFrame的CUSIP匹配代码以更具Pythonic风格?
优化多Broker价格列合并的Pythonic写法
方案一:循环遍历Broker键(简洁直观)
直接筛选字典中所有以Broker开头的键,批量完成映射操作,彻底避免重复代码:
# 提取所有Broker相关的键,排除Summary broker_keys = [key for key in x1 if key.startswith('Broker')] for broker in broker_keys: # 把当前Broker的Price映射到Summary对应列 x1['Summary'][broker] = x1['Summary']['CUSIP'].map(x1[broker].set_index('CUSIP')['Price'])
方案二:字典推导式+DataFrame.join(高效优雅)
通过字典推导式构建一个以CUSIP为索引、各Broker价格为列的映射表,再与Summary做左连接,是最符合Pythonic风格的写法:
import pandas as pd # 构建各Broker价格的统一映射表 broker_price_map = pd.DataFrame({ broker: x1[broker].set_index('CUSIP')['Price'] for broker in [key for key in x1 if key.startswith('Broker')] }) # 一次性将所有Broker价格列合并到Summary中 x1['Summary'] = x1['Summary'].join(broker_price_map, on='CUSIP')
方案三:批量合并后关联(适配复杂预处理)
如果需要对Broker数据做额外清洗或转换,可以先批量处理所有Broker的DataFrame,再与Summary关联:
import pandas as pd # 批量处理Broker数据,将Price列重命名为Broker名称 broker_dfs = [ x1[broker][['CUSIP', 'Price']].rename(columns={'Price': broker}) for broker in [key for key in x1 if key.startswith('Broker')] ] # 按CUSIP合并所有Broker的数据 merged_brokers = pd.merge(broker_dfs[0], broker_dfs[1:], on='CUSIP', how='outer') # 与Summary左连接,添加所有价格列 x1['Summary'] = x1['Summary'].merge(merged_brokers, on='CUSIP', how='left')
其中方案二的字典推导式+join写法最简洁高效,适合绝大多数场景,能轻松应对40个甚至更多Broker的情况。
内容的提问来源于stack exchange,提问作者PyNub
相关产品推荐
相关产品推荐

