python - 有效地将字典的键和值转换为 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 数据帧,所以希望给定的方法不会花费太长时间来应用。有谁知道如何做到这一点?谢谢
解决方案
您可以获取 的项目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
如果您想要具有不同名称的列,只需重命名它们。
以下是此方法针对不同大小的输入字典的一些时间比较。
分别比较100
,10,000
和1,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)
推荐阅读
- database-connection - 从 DatabaseSwingManager 连接时 HSQL 服务器模式引发异常 java.sql.SQLTransientConnectionException
- smartcard - Seaory S22证卡打印机编码器是否兼容Java Card
- azure - 带有 SSIS 包的 Azure Synapse
- asp.net-core - 如何将默认值添加到授权标头值
- r - (R语言)理解什么是“加权”图
- airflow - 在 Airflow 中实现分支
- php - 如何自动为 /storage/ 文件夹中的所有文件设置标题?
- marklogic - 如何在 MarkLogic Grove 中从我自己的 API 调用后端 MarkLogic API?
- python - deg 在 np.polyfit numpy 中做了什么
- excel - 如果条件不匹配,则给出下拉列表