3

Excelスプレッドシートを操作するためのpythonスクリプトを作成しようとしています。

サンプルデータがあるとします。

Gene        chrom    strand  TSS        TES         Name

NM_145215   chr5     +       135485168  135488045   Abhd11

NM_1190437  chr5     +       135485021  135488045   Abhd11

NM_1205181  chr14    +       54873803   54888844    Abhd4

NM_134076   chr14    +       54878906   54888844    Abhd4

NM_9594     chr2     +       31615464   31659747    Abl1

NM_1112703  chr2     +       31544075   31659747    Abl1

NM_207624   chr11    +       105829258  105851278   Abl1

NM_9598     chr11    +       105836521  105851278   Ace2

NM_1130513  chrX     +       160577273  160626350   Ace2

NM_27286    chrX     +       160578411  160626350   Ace2

これらの類似した名前 (列 6) については、最小の TSS で行全体を取得したいと考えています。たとえば、最初の 2 行の Abhd11 名については、TSS 135485021 < 135485168 であるため、結果の 2 行目を保存したいと考えています。同じ名前を持つすべてのセットについても同様です。

アイデアやコメントは大歓迎です。

4

4 に答える 4

4

入力

可能であれば、Excelファイルをcsvファイルとして保存し、csvモジュールを使用してPythonにロードします。

あるいは、xlrdExcelファイルを読み取るためにモジュールを使用することもできます-私はこれを使用したことがなく、それについてあまり知りませんが。

openpyxlは、Excelファイルを解析するための追加オプションです(もう1つの劣等生を応援します)。

操作

ernieのアイデアは実行可能であるように思われ、次のように実装します。linesreadfromfileこれが、を使用して読み取られたリストのリストであると仮定します。csv.readerつまり、各リスト要素は、ファイル内のその行の区切られたエントリに対応する値のリストです。

finaldict = {}
for row in linesreadfromfile:
    if finaldict.has_key(row[5]):
        if finaldict[row[5]][3] > row[3]:
            finaldict[row[5]] = row
    else:
        finaldict[row[5]] = row
于 2012-08-03T18:07:06.973 に答える
2

私はmutzmatronに同意し、xlrdモジュールをお勧めします。簡単な例を次に示します。

import xlrd

# Create your file handle
file_handle = xlrd.open_workbook(file_name)

# Use the first page in the spreadsheet (0-based indexes)
sheet = file_handle.sheet_by_index(0)

# Create dictionary for storing values
abc = {}

# Loop through every row
for i in range(sheet.nrows):
  line = sheet.row_values(i)

  # Get your 'Name' and 'TSS' columns
  name = line[5]
  tss = line[3]

  # Add this 'Name' to your dictionary if it's new, or keep the max value
  if name not in abc.keys():
    abc[name] = tss
  else:
    abc[name] = max(abc[name],tss)

仕様に基づいて、保存する必要があるもの (行全体、特定の値など) を明らかに変更します。

- - 編集 - -

  # If this 'Name' is new, save this line
  if name not in abc.keys():
    abc[name] = {'tss': tss, 'line': line}

  # Else, if this 'Name' is not new and the TSS is less, keep this new line
  elif tss < abc[name]['tss']:
    abc[name]['line'] = line
于 2012-08-03T18:18:12.910 に答える
0

Python Tools for Visual Studio チームから入手できる Pyvot を使用できます。CPython から Excel スプレッドシートを操作するための包括的な API を提供します。

PyPi からコードを取得できます: http://pypi.python.org/pypi/Pyvot また、Pytools サイトからドキュメントを取得できます: http://pytools.codeplex.com/wikipage?title=Pyvot

于 2012-08-03T18:17:18.307 に答える
0

Pythonコンソールと、Pythonでこのようなアクションをスクリプト化する方法を提供するIronSpreadを使用できます。また、通常の Excel 関数として使用できる UDF もサポートしているため、便利です。

于 2012-08-03T18:11:39.233 に答える