如何在Pandas中基于另一DataFrame的产品匹配重命名列?
调整DataFrame列映射以匹配产品编号对应关系
核心需求
让df1的产品编号与df2完全对应:df1中的Shirts对应Product 1、Pants对应Product 2、Shoes对应Product 3,同时关联各自的价格列。
解决方案
方法1:直接构造目标DataFrame(简单高效)
根据明确的对应关系,从df1中直接提取对应列的数据,构建符合要求的新DataFrame:
import pandas as pd df1 = pd.DataFrame(data={'Product 1':['Shoes'],'Product 1 Price':[25],'Product 2':['Shirts'],'Product 2 Price':[50],'Product 3':['Pants'],'Product 3 Price':24}) # 按df2的产品编号对应关系重组df1 df1_aligned = pd.DataFrame({ 'Product 1': df1['Product 2'], 'Product 1 Price': df1['Product 2 Price'], 'Product 2': df1['Product 3'], 'Product 2 Price': df1['Product 3 Price'], 'Product 3': df1['Product 1'], 'Product 3 Price': df1['Product 1 Price'] }) print(df1_aligned)
输出结构:
| Product 1 | Product 1 Price | Product 2 | Product 2 Price | Product 3 | Product 3 Price |
|---|---|---|---|---|---|
| Shirts | 50 | Pants | 24 | Shoes | 25 |
方法2:动态映射(适配多数据行/复杂场景)
如果df1包含多行数据,或产品对应关系可能变化,可通过映射规则动态整理:
import pandas as pd df1 = pd.DataFrame(data={'Product 1':['Shoes'],'Product 1 Price':[25],'Product 2':['Shirts'],'Product 2 Price':[50],'Product 3':['Pants'],'Product 3 Price':24}) # 定义产品到目标编号的映射(从df2的结构得出) product_target_map = { 'Shirts': 'Product 1', 'Pants': 'Product 2', 'Shoes': 'Product 3' } # 将df1转为长格式,拆分产品列和价格列的标识 df1_long = df1.melt(var_name='col', value_name='val') df1_long[['product_id', 'type']] = df1_long['col'].str.split(' ', expand=True) df1_long['type'] = df1_long['type'].replace({'Price': 'price', None: 'name'}) # 提取产品名称和价格的对应关系 name_map = df1_long[df1_long['type'] == 'name'].set_index('val')['product_id'] price_map = df1_long[df1_long['type'] == 'price'].set_index('product_id')['val'] # 构造新数据 new_data = {} for product, target_id in product_target_map.items(): original_id = name_map[product] new_data[target_id] = [product] new_data[f'{target_id} Price'] = [price_map[original_id]] df1_aligned = pd.DataFrame(new_data)
内容的提问来源于stack exchange,提问作者Sean R
相关产品推荐
相关产品推荐

