如何基于另一DataFrame的Age与Score列值为目标DataFrame新增列
问题与解决方案
问题背景
我有两个DataFrame:
第一个DataFrame(df1):
| Age | 200 | 300 | 400 |
|---|---|---|---|
| 1 | 34 | 32 | 50 |
| 2 | 42 | 73 | 20 |
第二个DataFrame(df2):
| ID | Age | Score |
|---|---|---|
| 10 | 2 | 200 |
| 23 | 1 | 300 |
需求:为df2新增一列Count,根据df2的Age和Score(Score的值对应df1的列名),从df1中匹配对应数据,最终得到如下结果:
| ID | Age | Score | Count |
|---|---|---|---|
| 10 | 2 | 200 | 42 |
| 23 | 1 | 300 | 32 |
解决方案
方法1:使用DataFrame.lookup(高效直接)
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'Age': [1, 2], '200': [34, 42], '300': [32, 73], '400': [50, 20]}) df2 = pd.DataFrame({'ID': [10, 23], 'Age': [2, 1], 'Score': [200, 300]}) # 将df2的Score转为字符串,匹配df1的列名(df1的列名是字符串类型) df2['Score'] = df2['Score'].astype(str) # 用lookup匹配:以df2的Age为行索引,Score为列名,从df1中取值 df2['Count'] = df1.set_index('Age').lookup(df2['Age'], df2['Score']) print(df2)
方法2:重塑df1为长格式后合并(更易理解)
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'Age': [1, 2], '200': [34, 42], '300': [32, 73], '400': [50, 20]}) df2 = pd.DataFrame({'ID': [10, 23], 'Age': [2, 1], 'Score': [200, 300]}) # 将df1从宽表转为长表,把列名转为Score列,对应值转为Count列 df1_melted = df1.melt(id_vars='Age', var_name='Score', value_name='Count') # 转换Score类型为整数,匹配df2的Score类型 df1_melted['Score'] = df1_melted['Score'].astype(int) # 根据Age和Score合并两个DataFrame result_df = df2.merge(df1_melted, on=['Age', 'Score'], how='left') print(result_df)
两种方法都能得到目标结果,方法1适合数据量较大的场景,效率更高;方法2逻辑更直观,便于调试和理解。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

