将 Python 字典转换为数据框

2024-12-04 08:56:00
admin
原创
148
摘要:问题描述:我有一本 Python 字典:{u'2012-07-01': 391, u'2012-07-02': 392, u'2012-07-03': 392, u'2012-07-04': 392, u'2012-07-05': 392, u'2012-07-06': 392} 我想将其转换为 p...

问题描述:

我有一本 Python 字典:

{u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

我想将其转换为 pandas 数据框,将日期及其对应的值作为两个单独的列;预期结果如下:

     Date         DateValue
0    2012-07-01    391
1    2012-07-02    392
2    2012-07-03    392
.    2012-07-04    392
.    ...           ...

有没有直接的方法可以做到这一点?


解决方案 1:

这里的错误是由于使用标量值调用 DataFrame 构造函数(它期望值是列表/字典/……即有多个列):

pd.DataFrame(d)
ValueError: If using all scalar values, you must must pass an index

您可以从字典中获取项目(即键值对):

In [11]: pd.DataFrame(d.items())  # or list(d.items()) in python 3
Out[11]:
            0    1
0  2012-07-01  391
1  2012-07-02  392
2  2012-07-03  392
3  2012-07-04  392
4  2012-07-05  392
5  2012-07-06  392

In [12]: pd.DataFrame(d.items(), columns=['Date', 'DateValue'])
Out[12]:
         Date  DateValue
0  2012-07-01        391
1  2012-07-02        392
2  2012-07-03        392
3  2012-07-04        392
4  2012-07-05        392
5  2012-07-06        392

但我认为传递 Series 构造函数更有意义:

In [20]: s = pd.Series(d, name='DateValue')

In [21]: s
Out[21]:
2012-07-01    391
2012-07-02    392
2012-07-03    392
2012-07-04    392
2012-07-05    392
2012-07-06    392
Name: DateValue, dtype: int64

In [22]: s.index.name = 'Date'

In [23]: s.reset_index()
Out[23]:
         Date  DateValue
0  2012-07-01        391
1  2012-07-02        392
2  2012-07-03        392
3  2012-07-04        392
4  2012-07-05        392
5  2012-07-06        392

解决方案 2:

当将字典转换为 pandas 数据框时,您希望将键作为所述数据框的列,将值作为行值,您可以简单地将字典括在括号中,如下所示:

>>> dict_ = {'key 1': 'value 1', 'key 2': 'value 2', 'key 3': 'value 3'}
>>> pd.DataFrame([dict_])
 
    key 1     key 2     key 3
0   value 1   value 2   value 3

编辑:在pandas 文档中,DataFrame 构造函数中参数的一个选项data是字典列表。这里我们传递了一个包含一个字典的列表。

解决方案 3:

正如另一个答案所解释的那样,DataFrame()直接在这里使用不会像您想象的那样。

你可以做的是DataFrame.from_dict()使用orient='index'

In [5]: d = {
   ...:     u'2012-07-01': 391,
   ...:     u'2012-07-02': 392,
   ...:     u'2012-07-03': 392,
   ...:     u'2012-07-04': 392,
   ...:     u'2012-07-05': 392,
   ...:     u'2012-07-06': 392}

In [6]: df = pd.DataFrame.from_dict(d, orient='index', columns=['DateValue'])

In [7]: df
Out[7]: 
            DateValue
2012-07-01        391
2012-07-02        392
2012-07-03        392
2012-07-04        392
2012-07-05        392
2012-07-06        392

为了得到你想要的东西:

In [8]: df.reset_index(names='Date')
Out[8]: 
         Date  DateValue
0  2012-07-01        391
...

解决方案 4:

将字典中的条目传递给 DataFrame 构造函数,并指定列名。之后解析Date列以获取Timestamp值。

注意python 2.x和3.x的区别:

在python 2.x中:

df = pd.DataFrame(data.items(), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])

在 Python 3.x 中:(需要额外的“列表”)

df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])

解决方案 5:

来自列表和字典的 df

ps 特别是,我发现面向行的示例很有帮助;因为通常这就是记录在外部存储的方式。

https://pbpython.com/pandas-list-dict.html

解决方案 6:

Pandas 具有将字典转换为数据框的内置函数。

pd.DataFrame.from_dict(dictionaryObject,orient='index')

对于您的数据,您可以像下面这样进行转换:

import pandas as pd
your_dict={u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 u'2012-06-13': 389,
 u'2012-06-14': 389,
 u'2012-06-15': 389,
 u'2012-06-16': 389,
 u'2012-06-17': 389,
 u'2012-06-18': 390,
 u'2012-06-19': 390,
 u'2012-06-20': 390,
 u'2012-06-21': 390,
 u'2012-06-22': 390,
 u'2012-06-23': 390,
 u'2012-06-24': 390,
 u'2012-06-25': 391,
 u'2012-06-26': 391,
 u'2012-06-27': 391,
 u'2012-06-28': 391,
 u'2012-06-29': 391,
 u'2012-06-30': 391,
 u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

your_df_from_dict=pd.DataFrame.from_dict(your_dict,orient='index')
print(your_df_from_dict)

解决方案 7:

这对我有用,因为我想有一个单独的索引列

df = pd.DataFrame.from_dict(some_dict, orient="index").reset_index()
df.columns = ['A', 'B']

解决方案 8:

pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })

解决方案 9:

重点在于如何将每个元素放入其中DataFrame

按行:

pd.DataFrame(dic.items(), columns=['Date', 'Value'])

或按列:

pd.DataFrame([dic])

解决方案 10:

我发现最简单的方法是创建一个空的数据框并附加字典。您需要告诉 panda 不要关心索引,否则您会收到错误:TypeError: Can only append a dict if ignore_index=True

import pandas as pd
mydict = {'foo': 'bar'}
df = pd.DataFrame()
df = df.append(mydict, ignore_index=True)

解决方案 11:

这对我来说是这样的:

df= pd.DataFrame([d.keys(), d.values()]).T
df.columns= ['keys', 'values']  # call them whatever you like

我希望这有帮助

解决方案 12:

接受一个字典作为参数并返回一个数据框,其中字典的键作为索引,值作为列。

def dict_to_df(d):
    df=pd.DataFrame(d.items())
    df.set_index(0, inplace=True)
    return df

解决方案 13:

您也可以将字典的键和值传递给新的数据框,如下所示:

import pandas as pd

myDict = {<the_dict_from_your_example>]
df = pd.DataFrame()
df['Date'] = myDict.keys()
df['DateValue'] = myDict.values()

解决方案 14:

在我的例子中,我希望字典的键和值是 DataFrame 的列和值。所以对我唯一有用的是:

data = {'adjust_power': 'y', 'af_policy_r_submix_prio_adjust': '[null]', 'af_rf_info': '[null]', 'bat_ac': '3500', 'bat_capacity': '75'} 

columns = list(data.keys())
values = list(data.values())
arr_len = len(values)

pd.DataFrame(np.array(values, dtype=object).reshape(1, arr_len), columns=columns)

解决方案 15:

%timeit在普通词典上的结果pd.DataFrame.from_dict()显然是赢家。

%timeit cols_df = pd.DataFrame.from_dict(clu_meta,orient='index',columns=['Columns_fromUser'])
214 µs ± 9.38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit pd.DataFrame([clu_meta])
943 µs ± 10.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit pd.DataFrame(clu_meta.items(), columns=['Default_colNames', 'Columns_fromUser'])
285 µs ± 7.91 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

解决方案 16:

我认为您可以在创建字典时对数据格式进行一些更改,然后可以轻松地将其转换为 DataFrame:

输入:

a={'Dates':['2012-06-08','2012-06-10'],'Date_value':[388,389]}

输出:

{'Date_value': [388, 389], 'Dates': ['2012-06-08', '2012-06-10']}

输入:

aframe=DataFrame(a)

输出:将是你的 DataFrame

您只需要在 Sublime 或 Excel 之类的程序中使用一些文本编辑功能。

解决方案 17:

d = {'Date': list(yourDict.keys()),'Date_Values': list(yourDict.values())}
df = pandas.DataFrame(data=d)

如果您没有将其封装yourDict.keys()在内list(),那么您最终会将所有键和值放置在每一行的每一列中。如下所示:

`Date n0 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...

1 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...

2 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...

3 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...

4 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...`

但添加list()后结果如下:

`Date Date_Values
0 2012-06-08 388
1 2012-06-09 388
2 2012-06-10 388
3 2012-06-11 389
4 2012-06-12 389
...`

解决方案 18:

我遇到过几次这种情况,并且有一个由函数创建的示例字典get_max_Path(),它返回示例字典:

`{2: 0.3097502930247044,
3: 0.4413177909384636,
4: 0.5197224051562838,
5: 0.5717654946470984,
6: 0.6063959031223476,
7: 0.6365209824708223,
8: 0.655918861281035,
9: 0.680844386645206}`

为了将其转换为数据框,我运行了以下命令:

df = pd.DataFrame.from_dict(get_max_path(2), orient = 'index').reset_index()

返回一个具有单独索引的简单两列数据框:

`index 0
0 2 0.309750
1 3 0.441318`

只需使用重命名列f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)

解决方案 19:

如果键应该是一个单独的列,那么构建一个系列,然后重置索引并重命名列就可以了。

d = {'2012-06-08': 388, '2012-06-09': 388, '2012-06-10': 388, '2012-06-11': 389}

df = pd.Series(d).rename_axis('Date').reset_index(name='Value')
df = pd.Series(d).reset_index().set_axis(['Date', 'Value'], axis=1)


         Date  Value
0  2012-06-08    388
1  2012-06-09    388
2  2012-06-10    388
3  2012-06-11    389

如果键应该是索引,那么构建一个Series,然后扩展为DataFrame就可以了。

df = pd.Series(d).to_frame('Value')


            Value
2012-06-08    388
2012-06-09    388
2012-06-10    388
2012-06-11    389

如果字典是深度嵌套的(类似于 json 对象),那么您也可以使用json_normalize()它来将其展平。

d = {'id': 0, 'Data': [{'x': {'a': 10, 'b': 2}}, {'x': {'a': 20, 'b': 1}}]}
df = pd.json_normalize(d, 'Data', 'id')


   x.a  x.b id
0   10    2  0
1   20    1  0
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用