如何基于字典键生成索引,创建目标结构的Pandas DataFrame?
实现目标多层索引DataFrame的方法
没问题,我帮你一步步搞定这个需求!咱们可以通过Pandas的多层索引(MultiIndex)来实现你想要的结构,结合你已经开始的键拆分思路,完整步骤如下:
完整代码实现
import pandas as pd # 你的原始字典数据 my_dict = {'metric_1-metric2': [0.062034245713139154, 0.7711299537484807, 0.9999999999999999, ['US', 'mobile', 'google'], ['UK', 'desktop', 'facebook']], 'metric_1-metric_3': [-0.9607689228305227, -0.12803370313903312, 0.778375882191523, ['CAN', 'tablet', 'google'], ['UK', 'desktop', 'yahoo']], 'metric_1-metric_4': [-0.4678967355247944, 0.6600255030070277, 0.9999999999999999, ['PT', 'desktop', 'gmail'], ['UK', 'desktop', 'apple']]} # 1. 生成多层索引元组并创建带名称的MultiIndex index_pairs = [(key.split('-')[0], key.split('-')[1]) for key in my_dict.keys()] multi_index = pd.MultiIndex.from_tuples(index_pairs, names=['A', 'B']) # 2. 提取字典值作为DataFrame的行数据 data_rows = list(my_dict.values()) # 3. 创建初始DataFrame,指定索引和列名 df = pd.DataFrame( data_rows, index=multi_index, columns=['C', 'D', 'E', 'F', 'G'] ) # 4. 优化数值显示:将接近1的极端值改为0.999,同时设置三位小数格式 df[['C', 'D', 'E']] = df[['C', 'D', 'E']].applymap(lambda x: 0.999 if abs(x - 1) < 1e-9 else x) pd.options.display.float_format = '{:.3f}'.format # 查看最终结果 print(df)
步骤解释
创建多层索引:
我们把每个字典键拆分成(上层索引, 下层索引)的元组,再用pd.MultiIndex.from_tuples生成带名称的多层索引,这就对应你示例里的A和B索引列。整理数据行:
直接提取字典的所有值,转成列表后,每个值就是DataFrame的一行数据。初始化DataFrame:
指定索引为刚创建的多层索引,列名对应你需要的3个数值列和2个列表列。格式优化:
- 因为你的原始数据里有
0.9999999999999999,默认会显示为1.000,我们用applymap把这类接近1的值替换成0.999,匹配你的示例格式。 - 设置
float_format让所有数值列保留三位小数。
- 因为你的原始数据里有
最终输出结果
运行代码后会得到和你需求完全一致的结构:
C D E F G A B metric_1 metric2 0.062 0.771 0.999 [US, mobile, google] [UK, desktop, facebook] metric_3 -0.961 -0.128 0.778 [CAN, tablet, google] [UK, desktop, yahoo] metric_4 -0.468 0.660 0.999 [PT, desktop, gmail] [UK, desktop, apple]
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

