按条件将DataFrame行内容拼接至另一DataFrame对应单元格的实现需求
解决方案
步骤1:预处理df2,拼接每个姓名对应的Kids
先对df2按Name分组,将每组的Kids拼接成指定分隔符的字符串,生成姓名与拼接后文本的映射关系:
import pandas as pd # 初始化原始数据 data = {'Name': ['Tom', 'nick', 'krish', 'jack'], 'Age': [20, 21, 19, 18], 'nickname': ['T', 'N', 'K','J']} df1 = pd.DataFrame(data) data2 = {'Kids': ['child1', 'child2', 'child3', 'child4', 'child1', 'child2', 'child3', 'child4'], 'Name': ['Tom', 'Tom', 'Tom', 'Tom', 'nick', 'nick', 'nick', 'nick'], 'nickname': ['T', 'T', 'T', 'T', 'N', 'N', 'N', 'N']} df2 = pd.DataFrame(data2) # 分组拼接Kids,这里用逗号分隔,可按需替换其他分隔符 kids_mapping = df2.groupby('Name')['Kids'].apply(lambda x: ','.join(x)).to_dict()
步骤2:替换df1的Name列,支持按行索引跳过
定义需要跳过的行索引列表,仅对非跳过的行执行姓名替换:
# 指定要跳过的行索引(示例:跳过索引2、3,对应krish和jack) skip_indices = [2, 3] # 遍历df1执行替换 for idx, row in df1.iterrows(): if idx not in skip_indices: # 若df1中的姓名在df2无匹配,保留原姓名避免报错 df1.loc[idx, 'Name'] = kids_mapping.get(row['Name'], row['Name']) # 查看最终结果 print(df1)
执行后输出结果:
Name Age nickname 0 child1,child2,child3,child4 20 T 1 child1,child2,child3,child4 21 N 2 krish 19 K 3 jack 18 J
补充说明
- 分隔符可自定义:将
','.join(x)替换为';'.join(x)或其他符号即可 - 容错处理:
kids_mapping.get()方法确保df1中无匹配的姓名不会被修改,避免KeyError - 跳过逻辑灵活:修改
skip_indices列表即可调整需要保留原姓名的行
内容的提问来源于stack exchange,提问作者Harry Smith
相关产品推荐
相关产品推荐

