如何基于列值修改Pandas DataFrame并新增关联关系对应行
问题原因
原有代码是直接对匹配到的现有行的relations字段赋值,每一轮循环都会覆盖上一轮的赋值结果,自然不会生成新的行存储多个关联值。
解决方案
通过合并关联表的方式实现需求,代码更简洁也符合pandas的惯用逻辑:
基础版(不保留原索引)
import pandas as pd data = { "names": ['a', 'b', 'c', 'd'], "ages": [50, 40, 45, 20], "relations": ['', '', '', ''] } rel_list = [('a', 'b'), ('a', 'c'), ('c', 'd')] df = pd.DataFrame(data) # 将关联关系转为DataFrame rel_df = pd.DataFrame(rel_list, columns=['names', 'relations']) # 原表基础属性和关联表左连接 df = df[['names', 'ages']].merge(rel_df, on='names', how='left') # 无关联的空值替换为空字符串 df['relations'] = df['relations'].fillna('') print(df)
完全对齐示例版(保留原索引)
如果需要和你给出的期望结果的索引完全一致,只需要增加保存/恢复原索引的逻辑:
import pandas as pd data = { "names": ['a', 'b', 'c', 'd'], "ages": [50, 40, 45, 20], "relations": ['', '', '', ''] } rel_list = [('a', 'b'), ('a', 'c'), ('c', 'd')] df = pd.DataFrame(data) # 保存原索引 df = df.reset_index(names='origin_idx') rel_df = pd.DataFrame(rel_list, columns=['names', 'relations']) df = df[['origin_idx', 'names', 'ages']].merge(rel_df, on='names', how='left') df['relations'] = df['relations'].fillna('') # 恢复原索引 df = df.set_index('origin_idx') df.index.name = None print(df)
运行后输出完全符合预期:
names ages relations 0 a 50 b 0 a 50 c 1 b 40 2 c 45 d 3 d 20
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

