将字典转换为数据框

时间:2019-12-13 00:53:10

标签: python pandas

我正在尝试转换此词典:

data = ({"Jan 2018":1000},{"Feb 2018":1100},{"Mar 2018":1400},{"Apr 2018":700},{"May 2018":800})
data

像这样的数据框:

date       balance
Jan 2018   1000
Feb 2018   1100
Mar 2018   1400
Apr 2018   700
May 2018   800

我使用了数据框进行转换,但是没有给出上面的格式,我该怎么办?谢谢!

pd.DataFrame.from_dict(data_c, orient='columns')

4 个答案:

答案 0 :(得分:1)

这是我的解决方法:

import pandas as pd

data = ({"Jan 2018":1000},{"Feb 2018":1100},{"Mar 2018":1400},{"Apr 2018":700},{"May 2018":800})

arr = [list(*d.items()) for d in data]

df = pd.DataFrame(arr, columns=['data', 'balance'])

您需要先从字典的元组中获取适当的数组,然后再将其传递给DataFrame。

答案 1 :(得分:0)

尝试一下

df = pd.DataFrame.from_dict({k: v for d in data for k, v in d.items()}, 
                             orient='index', 
                             columns=['balance']).rename_axis('date').reset_index()

Out[477]:
       date  balance
0  Jan 2018     1000
1  Feb 2018     1100
2  Mar 2018     1400
3  Apr 2018      700
4  May 2018      800

答案 2 :(得分:-1)

摘自from_dict

的文档
  

orient:{'columns','index'},默认为'columns'

     

数据的“方向”。如果传递的dict的键应该是结果DataFrame的列,请传递“ columns”(默认值)。否则,如果键应该是行,则传递“索引”。

由于您希望键指示行,因此将orient更改为index将得到您想要的结果。但是,首先您需要将数据放入一个字典中。该代码将为您提供所需的结果。

data = ({"Jan 2018":1000},{"Feb 2018":1100},{"Mar 2018":1400},{"Apr 2018":700},{"May 2018":800})

d = {}
for i in data:
    for k in i.keys():
        d[k] = i[k]

df = pd.DataFrame.from_dict(d, orient='index')

答案 3 :(得分:-2)

您拥有的是一个由单元素组成的字典的元组。这是单一的,而且设计较差。如果所有字典都对应于相同的列,那么元组列表就可以了。


解决方案

我相信当前接受的答案取决于每个字典中只有一个key:value对。不幸的是,因为它会自动排除这种设计有意义的大多数情况。


如果假设不能更改“一元字典的元组”,那么我将建议这样做:

import pandas as pd
import itertools as itt

raw_data = ({"Jan 2018": 1000}, {"Feb 2018": 1100}, {"Mar 2018": 1400}, {"Apr 2018": 700}, {"May 2018": 800})

data = itt.chain.from_iterable(curr.items() for curr in raw_data)

df = pd.DataFrame(data, columns=['date', 'balance'])

这是所有这些的明智选择。

import pandas as pd

data = [("Jan 2018", 1000), ("Feb 2018", 1100), ("Mar 2018", 1400), ("Apr 2018", 700), ("May 2018", 800)]

df = pd.DataFrame(data, columns=['date', 'balance'])

df

       date  balance
0  Jan 2018     1000
1  Feb 2018     1100
2  Mar 2018     1400
3  Apr 2018      700
4  May 2018      800

如果这些日期是实际的日期类型,而不是字符串,那可能会更好。我稍后会更改。