You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于DataFrame的Child列值合并两个DataFrame的方法

解决方案

步骤1:处理df2,提取分数并建立类别映射

首先从df2的Similarity_Score列提取纯数值,同时手动关联df1中Child列的对应类别(从预期结果可知,Severe weather对应第一个分数,Sunny类对应第二个分数):

import pandas as pd

# 原数据
df1 = pd.DataFrame({'Parent': ['Stay home', "Stay home","Stay home", 'Go outside', "Go Outside","Go outside"],
                    'Child' : ['Severe weather', "Severe weather", "Severe weather", 'Sunny', "Sunny", "sunny"]})

df2 = pd.DataFrame({'Similarity_Score': ['SimilarityScore:0.43693185876069784', 'SimilarityScore:0.299807821163373']})

# 提取分数数值并转换为浮点数
df2['score'] = df2['Similarity_Score'].str.split(':').str[1].astype(float)
# 添加对应Child类别
df2['Child'] = ['Severe weather', 'Sunny']
# 保留需要的列
df2 = df2[['Child', 'score']]

步骤2:统一Child列的大小写,避免匹配误差

df1的Child列存在Sunny和sunny的大小写差异,需要统一格式:

# 对两个DataFrame的Child列做归一化处理
df1['Child_normalized'] = df1['Child'].str.capitalize()
df2['Child_normalized'] = df2['Child'].str.capitalize()

步骤3:合并DataFrame

使用merge方法基于归一化后的Child列匹配:

result = pd.merge(df1, df2, on='Child_normalized', how='left')
# 整理列顺序并删除临时列
result = result[['Parent', 'Child', 'score']].rename(columns={'score': 'Similarity_Score'})

最终结果

运行后得到的result即为预期格式:

Parent           Child  Similarity_Score
0  Stay home  Severe weather          0.436932
1  Stay home  Severe weather          0.436932
2  Stay home  Severe weather          0.436932
3  Go outside           Sunny          0.299808
4  Go Outside           Sunny          0.299808
5  Go outside           sunny          0.299808

简化写法(可选)

如果不想创建临时列,可直接用映射字典完成:

# 建立分数映射字典
score_map = {
    'Severe weather': float(df2['Similarity_Score'].iloc[0].split(':')[1]),
    'Sunny': float(df2['Similarity_Score'].iloc[1].split(':')[1])
}

# 对df1的Child列统一格式后映射分数
df1['Similarity_Score'] = df1['Child'].str.capitalize().map(score_map)

内容的提问来源于stack exchange,提问作者xavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:40:36