【问题标题】:Converting both a dictionary's keys and values to columns in a pandas dataframe efficiently有效地将字典的键和值转换为 pandas 数据框中的列
【发布时间】:2021-04-21 19:34:21
【问题描述】:

我有一本这样的字典:

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 数据帧,因此希望给定的方法不会花费太长时间来应用。 有谁知道如何做到这一点?谢谢

【问题讨论】:

    标签: python json pandas dataframe dictionary


    【解决方案1】:

    您可以获取dict 的项目并将其展平。
    我使用itertools.chain 来压平dict
    然后对从项目创建的结果数据帧进行转置。

    >>> 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
    

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


    以下是此方法针对不同大小的输入字典的一些时间比较。
    分别比较 10010,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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2021-08-24
      • 2020-11-28
      • 2021-10-18
      • 2014-06-12
      相关资源
      最近更新 更多