基于字典键嵌套列表关联对象,实现Kiva数据集MPI值与区域匹配
解决Kiva贷款数据与MPI区域值关联的问题
我来帮你一步步搞定这个关联任务——核心就是处理贷款数据里多值/嵌套的Region字段,匹配到对应的MPI(多维贫困指数)值。下面用Python(以pandas为主)来实现完整流程:
1. 先加载并摸透两个数据集
第一步先把两个CSV文件读进来,看看数据结构,确认匹配的关键字段:
import pandas as pd # 加载MPI区域-值对应表 mpi_region_df = pd.read_csv('kiva_mpi_region_locations.csv') # 加载贷款主数据 kiva_loans_df = pd.read_csv('kiva_loans.csv') # 先快速查看MPI数据的对应关系 print(mpi_region_df[['region', 'MPI']].head()) # 看看贷款数据里Region字段的样例,判断是多值分隔还是嵌套结构 print(kiva_loans_df['Region'].sample(10))
2. 处理多值分隔的Region字段
如果你的Region字段是用逗号、分号这类分隔符拼接的多区域(比如"Central Java, Yogyakarta"),先把它拆成单个区域的列表,再展开成单行单区域的格式:
# 假设分隔符是「逗号+空格」,根据实际数据调整 kiva_loans_df['split_regions'] = kiva_loans_df['Region'].str.split(', ') # 把多区域的行拆成多行,每个区域单独一行,方便后续匹配 loans_exploded = kiva_loans_df.explode('split_regions', ignore_index=True)
3. 处理嵌套列表中的字典对象
如果Region字段是JSON格式的嵌套字典列表(比如[{"region_name":"X"}, {"region_name":"Y"}]),得先解析成Python对象,再提取区域名称:
import json # 解析JSON格式的Region字段,空值处理成空列表 kiva_loans_df['region_objects'] = kiva_loans_df['Region'].apply( lambda x: json.loads(x) if pd.notnull(x) else [] ) # 从嵌套字典里提取区域名称(这里假设字典的键是'region_name',根据实际键名调整) def extract_region_names(obj_list): return [obj['region_name'] for obj in obj_list if 'region_name' in obj] kiva_loans_df['split_regions'] = kiva_loans_df['region_objects'].apply(extract_region_names) # 同样展开成单行单区域 loans_exploded = kiva_loans_df.explode('split_regions', ignore_index=True)
4. 关联MPI值并整理结果
现在把展开后的贷款数据和MPI数据按区域名称关联,最后可以按贷款ID聚合结果:
# 先统一区域名称的格式,避免大小写、空格导致匹配失败 mpi_region_df['region'] = mpi_region_df['region'].str.strip().str.lower() loans_exploded['split_regions'] = loans_exploded['split_regions'].str.strip().str.lower() # 左连接,保留所有贷款数据,匹配对应的MPI值 merged_data = pd.merge( loans_exploded, mpi_region_df, left_on='split_regions', right_on='region', how='left' ) # 按贷款ID聚合,比如取对应区域的平均MPI,或者保留所有匹配的MPI值 final_result = merged_data.groupby('id').agg( original_region=('Region', 'first'), average_mpi=('MPI', 'mean'), all_matched_mpis=('MPI', list) ).reset_index()
5. 处理匹配不到的情况
有些区域可能在MPI数据里找不到对应值,可以标记出来或者统计缺失情况:
# 用特定值标记缺失的MPI merged_data['MPI'] = merged_data['MPI'].fillna('无匹配MPI数据') # 统计有多少个区域没有对应MPI值 missing_regions_count = merged_data[merged_data['MPI'] == '无匹配MPI数据']['split_regions'].nunique() print(f"共有{missing_regions_count}个区域未找到对应的MPI值")
关键注意点
- 区域名称一致性:两个数据集的区域名称可能存在大小写、拼写、空格差异,一定要先统一格式(比如转小写、去首尾空格)。
- 嵌套结构的键名:如果是嵌套字典,一定要确认存储区域名称的键(比如可能是
name、region而非region_name),根据实际数据调整提取逻辑。
内容的提问来源于stack exchange,提问作者Steven Miller
相关产品推荐
相关产品推荐

