首页 > 解决方案 > 有效地将字典的键和值转换为 pandas 数据框中的列

问题描述

我有一本像这样的字典:

dict1 = {k1:v1,k2:v2,k3:v3}

我想把这本字典变成一个数据框。我以前在这里看到过其他问题pd.Series(dict1),这会产生一个像这样的 DataFrame:

  Index  col1
    k1    v1
    k2    v2
    k3    v3

但就我而言,我希望 DataFrame 像:

Index  col1   col2  col3  col4   col5   col6
  0     k1     v1    k2    v2     k3     v3

因此,我希望将每个键和每个值都作为一列,并且不使用它们作为索引,这是传统上推荐的将 dict 转换为 DataFrame 的方法通常使用的方法。在此示例中,我希望 DataFrame 为 1x6,而不是 2x3 或 3x2。

我还有一个非常大的 N 字典字典,我想将它应用到,在这种情况下会产生一个 Nx6 数据帧,所以希望给定的方法不会花费太长时间来应用。有谁知道如何做到这一点?谢谢

标签: pythonjsonpandasdataframedictionary

解决方案


您可以获取 的项目dict并将其展平。
我曾经itertools.chaindict.
然后对从项目创建的结果数据框进行转置。

>>> import pandas as pd
>>> from itertools import chain
>>> d = {i: i*i for i in range(1, 6)}  # example dict
>>> d
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
>>> df = pd.DataFrame(chain(*d.items())).T
>>> df
   0  1  2  3  4  5  6   7  8   9
0  1  1  2  4  3  9  4  16  5  25

dict你的问题中,它看起来像这样,

>>> dict1 = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
>>> pd.DataFrame(chain(*dict1.items())).T
    0   1   2   3   4   5
0  k1  v1  k2  v2  k3  v3

如果您想要具有不同名称的列,只需重命名它们。


以下是此方法针对不同大小的输入字典的一些时间比较。
分别比较100,10,0001,00,000项目。

In [18]: d100_items = {i: i*i for i in range(100)}.items()

In [19]: d10_000_items = {i: i*i for i in range(10_000)}.items()

In [20]: d1_00_000_items = {i: i*i for i in range(1_00_000)}.items()

In [22]: %timeit pd.DataFrame(chain(*d100_items)).T
329 µs ± 10 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [23]: %timeit pd.DataFrame(chain(*d10_000_items)).T
4.62 ms ± 83.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [24]: %timeit pd.DataFrame(chain(*d1_00_000_items)).T
56.8 ms ± 1.4 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

推荐阅读