【问题标题】:Convert excel or csv file to pandas multilevel dataframe将 excel 或 csv 文件转换为 pandas 多级数据框
【发布时间】:2012-09-16 13:53:24
【问题描述】:

我收到了一个相当大的 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

测量次数可变(有时为零)。任何信息之间都没有完整的空白行,并且“测量”和“错误”列在具有其他(字符串)数据的行上为空;这可能会使解析变得更加困难(?)。有没有一种简单的方法可以自动进行这种转换?我最初的想法是先用 Python 解析文件,然后在循环中将内容输入 DataFrame 插槽,但我不知道具体如何实现它,或者它是否是最好的做法。

提前致谢!

【问题讨论】:

    标签: python excel csv dataframe pandas


    【解决方案1】:

    看起来您的文件有固定宽度的列,可以使用 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。你让我的生活变得轻松了很多。
    【解决方案2】:

    这至少会清理它以进行额外处理。

    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)
    

    【讨论】:

    • 谢谢,大卫。这不是我正在寻找的直接解决方案,但对解析文件很有指导意义。
    猜你喜欢
    • 2013-01-08
    • 2021-02-11
    • 2021-05-26
    • 2016-02-18
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多