web-dev-qa-db-ja.com

データの列を変数に割り当てる方法

.txtファイルから大量のデータを読み取ってプロットする一般的なプログラムを書いています。各ファイルには、異なる数の列があります。各ファイルには興味のない8つの列があることを知っているので、その方法で関連する列の数を把握できます。データを読み取り、関連する各列のデータを個別の変数に並べ替えるにはどうすればよいですか?

これは私がこれまでに持っているものです:

datafile = 'plotspecies.txt'
with open(datafile) as file:
    reader = csv.reader(file, delimiter=' ', skipinitialspace=True)
    first_row = next(reader)
    num_cols = len(first_row)
    rows = csv.reader(file, delimiter = ' ', quotechar = '"')
    data = [data for data in rows]

num_species = num_cols - 8

pandasはこの種のことには良いと言われていますが、インポートできないようです。それがないソリューションがいいと思います。

5
evtoh

パンダは実際、ここでの正しい解決策です。問題は、基礎となる構造がわからないものを堅牢に処理するために、注意しなければならないエッジケースがたくさんあり、それをcsvモジュールにシューホーンしようとすることです。頭痛のレシピ(それは可能ですが)

pandasをインポートできない理由は、デフォルトでpythonが付属していないためです。言語を選択する際に考慮すべき最も重要なことの1つは、言語がアクセスできるパッケージのエコシステムです。 Pythonはたまたまこの点で最高の1つなので、標準の一部ではないものをすべて無視するpythonは言語の最高の部分を無視することです。

Windows環境を使用している場合は、まずcondaを設定する必要があります。これにより、pythonユーザーが利用できるパッケージの多くを、オーバーヘッドをほとんどかけずにシームレスに探索できます。これには、実際にはこの問題を処理する正しい方法であるpandasが含まれます。を参照してください。 condaのインストールの詳細については、次のリンクを参照してください: http://conda.pydata.org/docs/install/quick.html

pandasをインストールすると、次のように簡単になります。

import pandas
test = pandas.read_csv(<your_file>)
your_Variable = test[<column_header>]

そのように簡単です。

コアにないものを本当に本当に使いたくない場合python次のようなものでこれを行うことができますが、実際の詳細については十分に説明していません解決:

def col_var(input_file, delimiter):
    # get each line into a variable
    rows = open(input_file).read().splitlines()

    # split each row into entries
    split_rows = [row.split(delimiter) for row in rows]

    # Re-orient your list
    columns = Zip(*split_rows)  

これの最も直感的でない部分は最後の行なので、これがどのように機能するかを示す小さな例です。

>>> test = [[1,2], [3,4]]
>>> Zip(*test)
[(1, 3), (2, 4)]
8

さて、列を設定する行内にある種の区切り文字があれば、csvモジュールを使用できます。

import csv

file_to_read_from = 'myFile.txt'

#initializing as many lists as the columns you want (not all)
col1, col2, col3 = [], [], []
with open(file_to_read_from, 'r') as file_in:
    reader = csv.reader(file_in, delimiter=';') #might as well be ',', '\t' etc
    for row in reader:
        col1.append(row[0]) # assuming col 1 in the file is one of the 3 you want
        col2.append(row[3]) # assuming col 4 in the file is one of the 3 you want
        col3.append(row[5]) # assuming col 6 in the file is one of the 3 you want
1
Ev. Kounis