pythonからエクセルのデータを加工する

社内はなんだかんだでエクセラーが多いので
基本エクセルベースのデータがたまります。
解析しようにもデータが正規化してないのでまずその加工から入るのですが
ルーチンだしモチベーション上がりません。
マクロ書くにもVBA勉強すんのもなーと思っておりましたら、pythonで行けるという事を教えていただきました。(感謝)
ググるとどうもxlrd, xlwd, xlutilsが良いようです。xlsxもサポートしているので社内の最近の環境でもバッチコイ。
でこれらはeasy_installかpipでさっくり入ります。winならインストーラーもあるようです。

早速使ってみました。
とりあえずやりたいのは、
ID ARGET_A TARGET_B TARGET_C TARGET_D
cmp1 1000nM 100nM 1000nM 500nM
cmp2 600nM 100nM 1050nM 500nM
みたいなやつを
ID TARGET MARK VALUE UNIT
cmp1 A = 1000 nM
cmp1 B = 100 nM
cmp1 C = 1000 nM
cmp1 D = 500 nM
みたいにしたいのです。
マクロ書けば簡単でしょ。とかいう人いますけど、言ってる人が書かない。
で、ターゲットとあるA、B、CはCYPでもHL60でも薬理活性でもいいですね。
さて、
セルに数値に合わせて>やら<やらコメントを素敵にアドオンしてくれるケースがあるので
この辺は正規表現モジュール使って頑張る?
同業の方はどうしているんだろう?今後の課題。
とりあえず数値だけでやってみます。
まずワークシートオブジェクトを作ってから
col_sliceで指定の列の値を一挙にとります。
index 0 の行はテーブルで言うところのヘッダーなので飛ばします。

で、各セルの型を評価して2(数値)だったら値を返して
文字列の場合はすっ飛ばします。
で数値の場合はIDリストから同じインデックスのものを取り出して横に書きます。
改行はデータ書き込みと別にしておくとデータ追加時の対応が楽なので最近この方法にしてます。

globやreは後々適当なフォルダの.xlsxを全部処理したかったり、記号に対応したいので書いてある。
ので今は使ってないです。
で書いたのがこんな感じ。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import xlrd
import glob, re

wb = xlrd.open_workbook("hoge.xlsx")
ws = wb.sheet_by_index(0)
f = open("normtable.txt","w")
f.write("ID\tTARGET\tMARK\tVALUE\tUNIT\tCOMMENT\n")
# ID TARGET MARK VALUE UNIT COMMENT
ids = ws.col_slice(0,start_rowx= 0)
assay0 = ws.col_slice(1, start_rowx = 0)
assay1 = ws.col_slice(2, start_rowx= 0)
assay2 = ws.col_slice(3, start_rowx = 0)
assay3 = ws.col_slice(4, start_rowx =0)

print ws.nrows

for i in range(ws.nrows):
    if i !=0:
        
        if assay0[i].ctype == 2:
            string = ids[i].value+"\tA\t"+"=\t"+"%s\tnM"%assay0[i].value
            f.write(string)
            f.write("\n")
        
        if assay1[i].ctype == 2:
            string = ids[i].value+"\tB\t"+"=\t"+"%s\tnM"%assay1[i].value
            f.write(string)
            f.write("\n")
        
        if assay2[i].ctype == 2:
            string = ids[i].value+"\tC\t"+"=\t"+"%s\tnM"%assay2[i].value
            f.write(string)
            f.write("\n")
        
        if assay3[i].ctype == 2:
            string = ids[i].value+"\tD\t"+"=\t"+"%s\tnM"%assay3[i].value
            f.write(string)
            f.write("\n")

f.close()

とりあえず動いたのでおけ。
Rのreshapeモジュールもかなり強力そうだったので入れといた。
ただこっちは文字列をゴニョゴニョするスキルがないのできれいなデータじゃないと対応できないな~