从多个字典创建一个pandas DataFrame。

35

我是pandas的新手,这是我在stackoverflow上的第一个问题,我试图使用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 }
如果一个字段为空(填充了空格),它将不会出现在字典中。
我想使用同一类别的所有记录创建一个pandas DataFrame,其中字典密钥作为列名,我尝试使用pandas.DataFrame.from_dict()但没有成功。
我的问题是:是否有任何方法可以使用pandas来使字典键成为列名?还有其他处理此类文件的标准方法吗?

请查看链接的重复内容,特别是这个答案。 - cs95
1个回答

52

要从字典创建DataFrame,您可以传递一个字典的列表

>>> 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 看到它们之前,您也可以将文件分成不同类型,这可能是最容易的方法。


谢谢,字典列表是关键。这些文件有数百MB的gzip压缩和数GB的未压缩,因此将逐行读取并附加到相应的DataFrame中。 - tinproject

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接