我正在try 将多个带有键和对应列表的字典转换为Pandas 数据帧,但无法找到正确的转换方法.对于Pandas 数据帧,键是索引列和列表

如何将具有键和对应列表(在值中)的python字典转换为具有键作为索引列、每个字典作为其他列的Pandas 数据帧?

以下是一组示例词典和我的一个非工作解决方案:

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)

这就是我所需要的结果数据帧的外观:

Pandas dataframe from python dictionaries with keys and value lists

我试着使用explode,如果我只有一本字典,它就会起作用,但对其他字典递归地使用它却不起作用.然后,我try 了这Stackoverflow transformation solution个解决方案中的一些,但无法使这些解决方案发挥作用,在某些情况下,是因为我的示例中的NAN.

推荐答案

您将需要fillna个列表,其中包含4个项目.遗憾的是,fillna不支持将列表作为参数.

但您可以利用stack/unstack(fill_value参数为unstack),然后explode所有列:

(df
 .stack()
 .unstack(fill_value=[pd.NA]*4)
 .explode(list(df))
)

输出:

      dict1 dict2 dict3
key_1     1     a    DD
key_1     2     b    CC
key_1     3     c    BB
key_1     4     d    AA
key_2     5     e  <NA>
key_2     6     f  <NA>
key_2     7     g  <NA>
key_2     8     h  <NA>
key_3     9     i    II
key_3    10     j    JJ
key_3    11     k    KK
key_3    12     l    LL

Python相关问答推荐

为什么判断pd.DataFrame的值与判断pd.Series的值存在差异(如果索引中有值)?

在有限数量的唯一字母的长字符串中,找到包含重复不超过k次的所有唯一字母的最长子字符串

Tkinter -控制调色板的位置

如何使用PyTest根据self 模拟具有副作用的属性

在Windows上启动新Python项目的正确步骤顺序

如何在Python中使用ijson解析SON期间检索文件位置?

强制venv在bin而不是收件箱文件夹中创建虚拟环境

使用GEKKO在简单DTE系统中进行一致初始化

Python会扔掉未使用的表情吗?

TARete错误:类型对象任务没有属性模型'

使用numpy提取数据块

Django mysql图标不适用于小 case

根据二元组列表在pandas中创建新列

我如何使法国在 map 中完全透明的代码?

实现自定义QWidgets作为QTimeEdit的弹出窗口

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

Python中的变量每次增加超过1

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

如何在达到end_time时自动将状态字段从1更改为0

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP