1

私は dtype = object のnumpy配列を持っています(実際にはさまざまなデータ型のリストです)。リストの配列(?)があるため、2D配列を作成します。この配列のすべての行と特定の列のみを別の配列にコピーしたい。csv ファイルからこの配列にデータを保存しました。この csv ファイルには、いくつかのフィールド (列) と大量の行が含まれています。データを配列に格納するために使用したコード チャンクを次に示します。

data = np.zeros((401125,), dtype = object)
for i, row in enumerate(csv_file_object):
    data[i] = row

データは基本的に次のように表すことができます

column1  column2  column3  column4  column5 ....
1         none     2       'gona'    5.3
2         34       2       'gina'    5.5
3         none     2       'gana'    5.1
4         43       2       'gena'    5.0
5         none     2       'guna'    5.7
.....     ....   .....      .....    ....
.....     ....   .....      .....    ....
.....     ....   .....      .....    ....

削除したい不要なフィールドが途中にあります。column3 が必要ないとします。配列からその列のみを削除するにはどうすればよいですか? または、関連する列のみを別の配列にコピーしますか?

4

3 に答える 3

4

パンダを使用します。また、あなたのようなさまざまなタイプのデータには、 のpandas.DataFrame方が適しているように思えます。

from StringIO import StringIO
from pandas import *
import numpy as np

data = """column1  column2  column3  column4  column5
1         none     2       'gona'    5.3
2         34       2       'gina'    5.5
3         none     2       'gana'    5.1
4         43       2       'gena'    5.0
5         none     2       'guna'    5.7"""

data = StringIO(data)
print read_csv(data, delim_whitespace=True).drop('column3',axis =1)

アウト:

   column1 column2 column4  column5
0        1    none  'gona'      5.3
1        2      34  'gina'      5.5
2        3    none  'gana'      5.1
3        4      43  'gena'      5.0
4        5    none  'guna'      5.7

DataFrame の代わりに配列が必要な場合は、次のto_records()メソッドを使用します。

df.to_records(index = False)
#output:
rec.array([(1L, 'none', "'gona'", 5.3),
           (2L, '34', "'gina'", 5.5),
           (3L, 'none', "'gana'", 5.1),
           (4L, '43', "'gena'", 5.0),
           (5L, 'none', "'guna'", 5.7)], 
            dtype=[('column1', '<i8'), ('column2', '|O4'),
                   ('column4', '|O4'), ('column5', '<f8')])
于 2013-01-28T09:17:28.663 に答える
3

CSV行を読み取って配列に貼り付けていると仮定するとnumpy、Maciek D.の回答が示すように、最も簡単で最良の解決策は、データが配列に到達する前にデータを前処理することです。(「列3を削除」よりも複雑なことをしたい場合は[value for i, value in enumerate(row) if i not in (1, 3, 5)]、のようなものが必要かもしれませんが、考え方は同じです。)

ただし、すでに配列をインポートしていて、事後にそれをフィルタリングしたい場合は、おそらく次のようにしtakeますdelete

>>> d=np.array([[1,None,2,'gona',5.3],[2,34,2,'gina',5.5],[3,None,2,'gana',5.1],[4,43,2,'gena',5.0],[5,None,2,'guna',5.7]])
>>> np.delete(d, 2, 1)
array([[1, None, gona, 5.3],
       [2, 34, gina, 5.5],
       [3, None, gana, 5.1],
       [4, 43, gena, 5.0],
       [5, None, guna, 5.7]], dtype=object)
>>> np.take(d, [0, 1, 3, 4], 1)
array([[1, None, gona, 5.3],
       [2, 34, gina, 5.5],
       [3, None, gana, 5.1],
       [4, 43, gena, 5.0],
       [5, None, guna, 5.7]], dtype=object)

「列3を削除する」という単純なケースの場合、deleteより理にかなっています。より複雑なケースの場合、takeおそらくより理にかなっています。

そもそもデータをインポートする方法をまだ理解していない場合は、組み込みcsvモジュールとMaciek D.のコードのようなものを使用して処理するかpandas.read_csv、後処理のようなものを使用することができます。ルートの答えが示すように、結果。

numpyただし、そもそもCSVではなくネイティブデータ形式を使用する方がよい場合があります。

于 2013-01-28T09:18:39.170 に答える
1

範囲選択を使用できます。例えば。column3を削除するには、次を使用できます。

data = np.zeros((401125,), dtype = object)
for i, row in enumerate(csv_file_object):
    data[i] = row[:2] + row[3:]

これは、csv_file_objectがリストを生成すると仮定して機能します。たとえば、でfile作成された単純なオブジェクトの場合は、ループcsv_file_object = open("file.cvs")に追加splitします。

data = np.zeros((401125,), dtype = object)
for i, row in enumerate(csv_file_object):
    row = row.split()
    data[i] = row[:2] + row[3:]
于 2013-01-28T08:56:02.950 に答える