如何基于其他DataFrame列值填充Python DataFrame列?
需求说明
现有两个DataFrame:
第一个DataFrame(店铺信息表):
Area id shop id Name 1 100 Apple 1 101 Apple 2 102 Banana 2 103 Banana 2 104 Jack 3 105 Orange 3 106 Orange 4 107 Kiwi 4 108 Kiwi 4 109 Cherry 4 110 Grape 4 111 Grape
第二个DataFrame(营收数据表):
shop id Price revenue 100 140 2000 101 150 3000 101 150 3500 102 130 2200 102 130 3300 102 130 3500 102 130 2700 103 135 3100 103 130 3300
需要基于第一个表的shop id,为第二个表填充Name列,得到目标DataFrame:
shop id Name Price revenue 100 Apple 140 2000 101 Apple 150 3000 101 Apple 150 3500 102 Banana 130 2200 102 Banana 130 3300 102 Banana 130 3500 102 Banana 130 2700 103 Banana 135 3100 103 Banana 130 3300
实现方法
方法一:使用Pandas的merge左连接
直接通过shop id将两个表进行左连接,因为第二个表的所有shop id都能在第一个表中找到匹配项,左连接后会自动填充对应的Name值,最后调整列顺序即可。
代码示例:
import pandas as pd # 模拟创建第一个DataFrame df1 = pd.DataFrame({ 'Area id': [1,1,2,2,2,3,3,4,4,4,4,4], 'shop id': [100,101,102,103,104,105,106,107,108,109,110,111], 'Name': ['Apple','Apple','Banana','Banana','Jack','Orange','Orange','Kiwi','Kiwi','Cherry','Grape','Grape'] }) # 模拟创建第二个DataFrame df2 = pd.DataFrame({ 'shop id': [100,101,101,102,102,102,102,103,103], 'Price': [140,150,150,130,130,130,130,135,130], 'revenue': [2000,3000,3500,2200,3300,3500,2700,3100,3300] }) # 左连接两个表,匹配shop id result = pd.merge(df2, df1[['shop id', 'Name']], on='shop id', how='left') # 调整列顺序为目标格式 result = result[['shop id', 'Name', 'Price', 'revenue']] print(result)
方法二:创建映射字典后用map填充
先从第一个表提取shop id和Name的唯一映射关系(每个shop id对应唯一的Name),然后用map方法给第二个表添加Name列。
代码示例:
import pandas as pd # 模拟创建两个DataFrame df1 = pd.DataFrame({ 'Area id': [1,1,2,2,2,3,3,4,4,4,4,4], 'shop id': [100,101,102,103,104,105,106,107,108,109,110,111], 'Name': ['Apple','Apple','Banana','Banana','Jack','Orange','Orange','Kiwi','Kiwi','Cherry','Grape','Grape'] }) df2 = pd.DataFrame({ 'shop id': [100,101,101,102,102,102,102,103,103], 'Price': [140,150,150,130,130,130,130,135,130], 'revenue': [2000,3000,3500,2200,3300,3500,2700,3100,3300] }) # 创建shop id到Name的映射字典(去重避免重复键) shop_name_map = df1.drop_duplicates(subset='shop id').set_index('shop id')['Name'].to_dict() # 给df2添加Name列 df2['Name'] = df2['shop id'].map(shop_name_map) # 调整列顺序 df2 = df2[['shop id', 'Name', 'Price', 'revenue']] print(df2)
两种方法都能实现需求:方法一适合不需要额外处理映射的场景,操作简单直接;方法二更灵活,生成的映射字典可复用在其他需要匹配的场景中。
内容的提问来源于stack exchange,提问作者thangaraj1980
相关产品推荐
相关产品推荐

