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

如何基于label匹配将DataFrame记录插入另一DataFrame对应行上方?

解决方案

方法1:逐行插入(每条df1记录前插入df2同label所有记录)

如果需求是每条df1的记录上方都插入df2中所有同label的记录,可以用以下代码实现:

import pandas as pd

df1 = pd.DataFrame(
{
    'sentence': ['text1', 'text2', 'text3', 'text1', 'text1', 'text2'],
    'label': ['abc', 'abc', 'abc', 'def', 'ghi', 'ghi']
}
)

df2 = pd.DataFrame(
{
    'sentence': ['html_text1', 'html_text2', 'html_text3', 'html_text4'],
    'label': ['abc', 'abc', 'def', 'ghi']
}
)

# 对df2按label分组,提升查询效率
label_groups = df2.groupby('label')

# 初始化结果存储列表
result_parts = []

# 遍历df1每一行
for _, row in df1.iterrows():
    # 获取当前行label对应的df2记录(无匹配则为空DataFrame)
    matched_df2_rows = label_groups.get_group(row['label']) if row['label'] in label_groups.groups else pd.DataFrame()
    # 先加df2匹配记录,再加当前df1记录
    result_parts.append(matched_df2_rows)
    result_parts.append(pd.DataFrame([row]))

# 拼接所有部分得到最终DataFrame
final_df = pd.concat(result_parts, ignore_index=True)
print(final_df)

输出结果:

sentence label
0   html_text1   abc
1   html_text2   abc
2        text1   abc
3   html_text1   abc
4   html_text2   abc
5        text2   abc
6   html_text1   abc
7   html_text2   abc
8        text3   abc
9   html_text3   def
10       text1   def
11  html_text4   ghi
12       text1   ghi
13  html_text4   ghi
14       text2   ghi

方法2:按label分组插入(同label的df2记录仅插入一次)

如果需求是每个label仅插入一次df2的对应记录,之后放置该label下所有df1的记录,可以用更高效的分组拼接方式:

import pandas as pd

df1 = pd.DataFrame(
{
    'sentence': ['text1', 'text2', 'text3', 'text1', 'text1', 'text2'],
    'label': ['abc', 'abc', 'abc', 'def', 'ghi', 'ghi']
}
)

df2 = pd.DataFrame(
{
    'sentence': ['html_text1', 'html_text2', 'html_text3', 'html_text4'],
    'label': ['abc', 'abc', 'def', 'ghi']
}
)

# 初始化结果存储列表
result_parts = []

# 遍历df1中所有唯一label
for label in df1['label'].unique():
    # 先加入df2对应label的记录
    result_parts.append(df2[df2['label'] == label])
    # 再加入df1对应label的记录
    result_parts.append(df1[df1['label'] == label])

# 拼接得到最终DataFrame
final_df = pd.concat(result_parts, ignore_index=True)
print(final_df)

输出结果:

sentence label
0   html_text1   abc
1   html_text2   abc
2        text1   abc
3        text2   abc
4        text3   abc
5   html_text3   def
6        text1   def
7   html_text4   ghi
8        text1   ghi
9        text2   ghi

关于iterrows()的说明

iterrows()逐行遍历的效率极低,仅适合小数据场景。方法1虽用到iterrows(),但提前对df2分组减少了重复查询开销;方法2完全避免逐行遍历,效率更高,适合大数据量场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:15:52