如何用for循环匹配DataFrame索引值与元素值并替换列内容
解决DataFrame索引匹配替换问题
最优方案:用Pandas向量化操作(不推荐for循环)
Pandas原生向量化操作比for循环效率高得多,优先推荐这种方法:
- 先把
wiki_adj的ind_num转为整数类型(匹配poss的整数索引),再将ind_num设为df的索引:
import pandas as pd # 整理原wiki_adj的换行问题,确保代码可运行 wiki_adj = { 'ind_num': ['11','20','25','27','35','41','42','48','49','51','54','56','60','61','62'], 'designation': [ 'Illegal (Decriminalized)', 'Illegal (unenforced)', 'Illegal (unenforced)', 'Illegal (unenforced)', 'Illegal (unenforced)', 'Legal', 'Legal', 'Illegal', 'Illegal', 'Illegal (Decriminalized)', 'Illegal (Decriminalized)', 'Illegal (unenforced)', 'Illegal', 'Illegal (Decriminalized)', 'Illegal (unenforced)' ] } df = pd.DataFrame(wiki_adj) # 转换索引类型并设置为df的索引 df['ind_num'] = df['ind_num'].astype(int) df.set_index('ind_num', inplace=True) # 匹配索引并替换boss列 poss['boss'] = poss.index.map(df['designation'])
如果只想替换匹配到的行,保留未匹配行的原有值,可用update:
# 生成索引-职位的映射字典 designation_map = df['designation'].to_dict() # 仅更新poss中存在匹配索引的boss值 poss['boss'].update(poss.index.map(designation_map))
你要的for循环实现方法
如果一定要用for循环遍历,代码如下:
import pandas as pd # 整理wiki_adj数据 wiki_adj = { 'ind_num': ['11','20','25','27','35','41','42','48','49','51','54','56','60','61','62'], 'designation': [ 'Illegal (Decriminalized)', 'Illegal (unenforced)', 'Illegal (unenforced)', 'Illegal (unenforced)', 'Illegal (unenforced)', 'Legal', 'Legal', 'Illegal', 'Illegal', 'Illegal (Decriminalized)', 'Illegal (Decriminalized)', 'Illegal (unenforced)', 'Illegal', 'Illegal (Decriminalized)', 'Illegal (unenforced)' ] } df = pd.DataFrame(wiki_adj) # 遍历df的每一行 for idx, row in df.iterrows(): # 将ind_num转为整数,匹配poss的索引类型 ind_num = int(row['ind_num']) # 检查索引是否存在于poss中 if ind_num in poss.index: # 替换对应行的boss值 poss.loc[ind_num, 'boss'] = row['designation']
注:如果poss的索引是字符串类型,无需转换ind_num的类型,直接用row['ind_num']匹配即可。
内容的提问来源于stack exchange,提问作者dane w
相关产品推荐
相关产品推荐

