如何基于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
相关产品推荐
相关产品推荐

