将Excel或CSV文件转换为Pandas多级数据框。

6

我被分配了一个相当大的Excel文件(5k行),也有一个CSV版本,我想将其制作成pandas多级DataFame。该文件的结构如下:

SampleID    OtherInfo    Measurements    Error    Notes
sample1     stuff                                 more stuff
                         36              6
                         26              7
                         37              8
sample2     newstuff                              lots of stuff
                         25              6
                         27              7

在这个相关it技术的问题中,需要翻译的内容是:当测量数量是可变的(有时为零)时。任何信息之间都没有完全空白的行,而“测量”和“误差”列在具有其他(字符串)数据的行上为空;这可能会使解析更加困难。是否有一种简单的方法来自动完成此转换?我的初始想法是先用Python解析文件,然后在循环中将内容输入DataFrame插槽,但我不知道如何实现,或者它是否是最佳操作方法。
谢谢!
2个回答

5

看起来你的文件包含固定宽度的列,可以使用read_fwf()函数进行读取。

In [145]: data = """\
SampleID    OtherInfo    Measurements    Error    Notes                   
sample1     stuff                                 more stuff              
                         36              6
                         26              7
                         37              8
sample2     newstuff                              lots of stuff           
                         25              6
                         27              7
"""

In [146]: df = pandas.read_fwf(StringIO(data), widths=[12, 13, 14, 9, 15])

好的,现在我们有了数据,只需要再做一点额外的工作,你就可以用set_index()创建一个多级索引。

In [147]: df[['Measurements', 'Error']] = df[['Measurements', 'Error']].shift(-1)

In [148]: df[['SampleID', 'OtherInfo', 'Notes']] = df[['SampleID', 'OtherInfo', 'Notes']].fillna()

In [150]: df = df.dropna()

In [151]: df
Out[151]:
  SampleID OtherInfo  Measurements  Error          Notes
0  sample1     stuff            36      6     more stuff
1  sample1     stuff            26      7     more stuff
2  sample1     stuff            37      8     more stuff
4  sample2  newstuff            25      6  lots of stuff
5  sample2  newstuff            27      7  lots of stuff

谢谢,Wouter。你刚刚让我的生活变得更轻松了。 - cossatot

1

这将至少为进一步处理清理它。

import csv
reader = csv.Reader(open(<csv_file_name>)
data = []
keys = reader.next()
for row in reader():
    r = dict(zip(keys,row))
    if not r['measurements'] or not r['Error']:
        continue
    for key in ['SampleID', 'OtherInfo', 'Notes']:
        if not r[key]:
            index = -1
            while True:
                if data[index][key]:
                    r[key] = data[index][key]
                    break
                index -= 1
    data.append(r)

谢谢,David。虽然不是我正在寻找的直接解决方案,但对于解析文件仍然很有指导意义。 - cossatot

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