如何通过匹配列名与列值,从另一DataFrame为pandas新增列?
问题
现有两个DataFrame,需要为df1新增SCORE列,列值来自df2,匹配规则为:
df1的NAME列与df2的NAME列对应df1的YEAR列值对应df2的列名
示例数据:
# df1 NAME YEAR Anna 2002 Mary 2001 Paul 2000 Paul 2001 Mary 2002 Anna 2001 Anna 2000 Mary 2000 Paul 2002 # df2 NAME 2000 2001 2002 Anna 5 4 3 Mary 3 2 5 Paul 2 3 4
预期结果:
NAME YEAR SCORE Anna 2002 3 Mary 2001 2 Paul 2000 2 Paul 2001 3 Mary 2002 5 Anna 2001 4 Anna 2000 5 Mary 2000 3 Paul 2002 4
尝试过按NAME合并两个DataFrame,但会新增三列,无法得到目标结果,希望得到简洁的解决方案。
解决方案
方法1:宽表转长表后合并
先将df2的年份列转换为行(宽表转长表),再通过NAME和YEAR与df1合并:
import pandas as pd # 将df2转换为长格式,指定id列为NAME,年份列转为YEAR,值列为SCORE df2_long = df2.melt(id_vars='NAME', var_name='YEAR', value_name='SCORE') # 统一YEAR列类型(若df1的YEAR是整数,需将df2_long的YEAR转为整数) df2_long['YEAR'] = df2_long['YEAR'].astype(int) # 按NAME和YEAR列合并两个DataFrame result_df = pd.merge(df1, df2_long, on=['NAME', 'YEAR'], how='left')
方法2:使用lookup函数直接匹配
利用pandas的lookup函数快速匹配对应位置的值,效率更高:
import pandas as pd # 将df2设置NAME为索引,便于按姓名匹配 df2_indexed = df2.set_index('NAME') # 用lookup获取对应SCORE:第一个参数是行索引值,第二个参数是列名 df1['SCORE'] = df2_indexed.lookup(df1['NAME'], df1['YEAR'].astype(str))
注意:若
df1的YEAR是整数类型,需转为字符串,因为df2的列名是字符串格式的年份。
方法3:逐行处理(仅小数据量适用)
如果数据量较小,也可以用apply逐行取值,但大数据量下效率较低,不推荐:
import pandas as pd df1['SCORE'] = df1.apply( lambda row: df2.loc[df2['NAME'] == row['NAME'], str(row['YEAR'])].values[0], axis=1 )
内容的提问来源于stack exchange,提问作者no_more_lemons
相关产品推荐
相关产品推荐

