2

csv ファイルに次のような 5000 行のデータがあります。後で各グループのデータをプロットするため、numpy 配列を使用して最後の列 6 (つまり、A、B) でグループ化したいと思います。

Title
Date, Time, Value1, Value2, Value3, Value4, Value5
,, Unit1, Unit2, Unit3,,
2012-04-02,00:00, 85.5333333333333, 4.87666666666667,    8.96,  323.27,A
2012-04-02,00:30, 196.5, 5.49,    8.42,  323.15,B
2012-04-02,01:00, 68.2, 4.47,    7.83,  325.30,A
2012-04-02,01:30, 320.9, 6.77333333333333,    8.05,  326.63,B

np.genfromtxt でデータをロードするときに dtype=None を指定する必要がありました。そうしないと、A 項が NaN になります 最初の列が文字列で残りの列が数値の場合に numpy.genfromtxt を使用するには

ここで言及されている最後の列に基づいてすべての値を返すために itertools groupby を使用しようとしています: How do I use Python's itertools.groupby()? しかし、最初に、numpy 配列をソートする必要があります。

6番目の列をスプライシングし、 Python(Numpy)配列ソート Ieをソートすることにより、高度なインデックス付けを使用しようとしました。v[v[:,0].argsort()]

ただし、これは numpy が私のレコードを私の dtype の 1D 配列 (none に設定されていた) として扱うことに言及しているリンクであり、これをソートしようとして同じインデックス エラーに遭遇しました: Numpy Array Column Slicing Produces IndexError: invalid index例外

質問:

1)列6の文字列値に基づいてgroupbyを使用してnumpy配列を分割し、それらを個別にプロットするにはどうすればよいですか?

2) 1 行目 (タイトル) と 3 行目 (ユニット) をスキップして 2 行目 (列見出し) とデータを残すことができるように、行をスキップできるとよいでしょう。利用可能なオプションを使用して簡単にそれを行う方法を知っている人はいますか?

これは私がこれまでに持っているスクリプトです:

import numpy as np
from matplotlib import pyplot as plt
from itertools import groupby
import csv

regression_data_dp1 = np.genfromtxt(“file.csv”, delimiter=',', skiprows=3, dtype=None)

sortindex = regression_data_dp1[:,6]

#Error is hit at this step:
#    sortindex = regression_data_dp1[:,6]
#IndexError: invalid index

regression_data_dp1_sorted = regression_data_dp1[ regression_data_dp1(:,column_WRF_wind_direction).argsort()]

for key, group in groupby(regression_data_dp1, lambda x: x[0]):
    print key

    with open(“file_" + key.strip() + ".csv", 'w') as data_file:
        wr=csv.writer(data_file, quoting=csv.QUOTE_ALL)
        for item in (group):            
            wr.writerow(item)
4

2 に答える 2

2

配列の行をソートする代わりに、 を使用して、同じ行を選択するitertools.groupbyことができます:group = arr[arr['f6']==key]key

import numpy as np
import csv

def load_csv(filename):
    with open(filename) as f:
        next(f)
        header = [item.strip() for item in next(f).split(',')]
    arr = np.genfromtxt("file.csv", delimiter=',', skiprows=3, dtype=None)
    arr.dtype.names = header
    return arr

arr = load_csv("file.csv")
keys = np.unique(arr['Value5'])

for key in keys:
    group = arr[arr['Value5']==key]
    filename = 'file_{}.csv' .format(key.strip())
    with open(filename, 'w') as data_file:
        wr = csv.writer(data_file, quoting=csv.QUOTE_ALL)
        wr.writerows(group)

np.genfromtxt2 行目をヘッダーとして使用するよう指示する直接的な機能はありません。おそらく最も簡単な方法は、ファイルを開き、2 行目をヘッダーのリストに丸呑みし、ファイルを閉じてから、 を使用genfromtxtして配列をロードし、 を使用arr.dtype.names = headerして構造化配列に目的の列名を与えることです。

于 2013-07-10T01:20:10.860 に答える