5

パンダのマルチレベル DataFame にしたい、かなり大きな Excel ファイル (5k 行) も CSV として与えられました。ファイルは次のように構成されています。

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スロットにフィードすることですが、それを実装する方法、またはそれが最善の方法であるかどうかさえわかりません。

前もって感謝します!

4

2 に答える 2

4

ファイルには 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])

OK、これでデータができました。ほんの少し余分な作業があり、set_index() を使用して MultiLevel インデックスを作成できるフレームができました。

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
于 2012-09-25T06:52:35.440 に答える
0

これにより、少なくとも追加の処理のためにクリーンアップされます。

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)
于 2012-09-25T05:35:09.753 に答える