如何将键对应列表值的Python字典转为键为索引的pandas DataFrame
多列表值字典转指定结构Pandas DataFrame实现
需求说明
- 字典键作为DataFrame的行索引
- 每个输入字典单独对应DataFrame的一列
- 字典中键对应的列表值需要逐元素展开为单独行,不能将整个列表作为单元格内容
- 自动兼容部分字典缺失键的场景,缺失位置正常填充NaN
原有问题代码
import pandas as pd dict1 = {'key_1': [1, 2, 3, 4], 'key_2': [5, 6, 7, 8], 'key_3': [9, 10, 11, 12]} dict2 = {'key_1': ['a', 'b', 'c', 'd'], 'key_2': ['e', 'f', 'g', 'h'], 'key_3': ['i', 'j', 'k', 'l']} dict3 = {'key_1': ['DD', 'CC', 'BB', 'AA'], 'key_3': ['II', 'JJ', 'KK', 'LL']} df = pd.DataFrame.from_dict({'dict1':pd.Series(dict1), 'dict2':pd.Series(dict2), 'dict3':pd.Series(dict3)}) print(df)
以上代码运行后,单元格存储的是完整列表,未做逐元素展开,不符合预期。
正确实现代码
直接对初始生成的DataFrame做多列explode即可,无需递归操作,自动兼容缺失键的NaN填充:
import pandas as pd dict1 = {'key_1': [1, 2, 3, 4], 'key_2': [5, 6, 7, 8], 'key_3': [9, 10, 11, 12]} dict2 = {'key_1': ['a', 'b', 'c', 'd'], 'key_2': ['e', 'f', 'g', 'h'], 'key_3': ['i', 'j', 'k', 'l']} dict3 = {'key_1': ['DD', 'CC', 'BB', 'AA'], 'key_3': ['II', 'JJ', 'KK', 'LL']} df = pd.DataFrame.from_dict({ 'dict1': pd.Series(dict1), 'dict2': pd.Series(dict2), 'dict3': pd.Series(dict3) # 同时对三列做列表展开,保留原有字典键作为索引 }).explode(column=['dict1', 'dict2', 'dict3'], ignore_index=False) # 如果需要把作为索引的字典键转为普通列,放开下面这行注释即可 # df = df.reset_index(names='dict_key') print(df)
版本兼容说明
- pandas 1.3.0及以上版本支持
explode传入列名列表同时展开多列 - 低版本pandas可以用逐列展开的写法替代:
df = pd.DataFrame.from_dict({ 'dict1': pd.Series(dict1), 'dict2': pd.Series(dict2), 'dict3': pd.Series(dict3) }).apply(lambda col: col.explode())
内容的提问来源于stack exchange,提问作者Jose R
相关产品推荐
相关产品推荐

