从多个dicts创建一个pandas DataFrame [重复]

Posted

技术标签:

【中文标题】从多个dicts创建一个pandas DataFrame [重复]【英文标题】:Create a pandas DataFrame from multiple dicts [duplicate] 【发布时间】:2013-07-19 01:35:00 【问题描述】:

我是 pandas 的新手,这是我在 *** 上的第一个问题,我正在尝试对 pandas 进行一些分析。

我有一些文本文件,其中包含我想要处理的数据记录。文件的每一行都匹配一个记录,哪些字段位于固定位置并且具有固定字符数的长度。同一个文件有不同种类的记录,所有记录共享第一个字段,根据记录的类型,两个字符。举个例子:

Some file:
01Jhon      Smith     555-1234                                        
03Cow            Bos primigenius taurus        00401                  
01Jannette  Jhonson           00100000000                             
...


field    start  length   
type         1       2   *common to all records, example: 01 = person, 03 = animal
name         3      10
surname     13      10
phone       23       8
credit      31      11
fill of spaces

我正在编写一些代码来将一条记录转换为字典:

person1 = 'type': 01, 'name': = 'Jhon', 'surname': = 'Smith', 'phone': '555-1234'
person2 = 'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00
animal1 = 'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 

如果字段为空(用空格填充),则字典中不会出现)。

对于一种类型的所有记录,我想创建一个以 dicts 键作为列名的 pandas DataFrame,我尝试使用 pandas.DataFrame.from_dict() 没有成功。

我的问题来了:有什么方法可以用 pandas 做到这一点,所以 dict 键成为列名?还有其他标准方法来处理这种文件吗?

【问题讨论】:

查看链接的副本,尤其是this answer. 【参考方案1】:

要从字典中创建 DataFrame,您可以传递一个 list 字典:

>>> person1 = 'type': 01, 'name': 'Jhon', 'surname': 'Smith', 'phone': '555-1234'
>>> person2 = 'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00
>>> animal1 = 'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 
>>> pd.DataFrame([person1])
   name     phone surname  type
0  Jhon  555-1234   Smith     1
>>> pd.DataFrame([person1, person2])
    credit      name     phone  surname  type
0      NaN      Jhon  555-1234    Smith     1
1  1000000  Jannette       NaN  Jhonson     1
>>> pd.DataFrame.from_dict([person1, person2])
    credit      name     phone  surname  type
0      NaN      Jhon  555-1234    Smith     1
1  1000000  Jannette       NaN  Jhonson     1

对于两个不同格式的文件混合的更基本的问题,假设文件不是太大以至于我们无法读取它们并将它们存储在内存中,我会使用StringIO 来制作一个对象有点像一个文件,但只有我们想要的行,然后使用read_fwf(固定宽度文件)。例如:

from StringIO import StringIO

def get_filelike_object(filename, line_prefix):
    s = StringIO()
    with open(filename, "r") as fp:
        for line in fp:
            if line.startswith(line_prefix):
                s.write(line)
    s.seek(0)
    return s

然后

>>> type01 = get_filelike_object("animal.dat", "01")
>>> df = pd.read_fwf(type01, names="type name surname phone credit".split(), 
                     widths=[2, 10, 10, 8, 11], header=None)
>>> df
   type      name  surname     phone     credit
0     1      Jhon    Smith  555-1234        NaN
1     1  Jannette  Jhonson       NaN  100000000

应该可以。当然,您也可以在pandas 看到它们之前将文件分成不同的类型,这可能是最简单的。

【讨论】:

谢谢,list of dicts 是关键。这些文件是数百 Mbs gzip 压缩和几个 Gbs 未压缩,因此将逐行读取并附加到相应的 DataFrame。

以上是关于从多个dicts创建一个pandas DataFrame [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含Python3中特定索引和列的列表的dict创建Pandas DataFrame?

Pandas之:深入理解Pandas的数据结构

将 pandas GroupBy 中的多个列值聚合为 dict

来自 pandas 数据框列的 dict

pandas:从字典创建数据框

[python][pandas]DataFrame的基本操作