表を修正する

中のデータ値 Table 対象の修正方法と numpy 構造化配列は,データ列や行にアクセスして適切に割り当てることで実現される.重要な強化機能を提供しています Table クラスは、表構造を修正する能力です:列を追加または削除し、新しいデータ行を追加することができます。

迅速な概要

次のコードは,修正表とそのデータの基礎知識を示す.

実例.

テーブルを一つ作る **

>>> from astropy.table import Table
>>> import numpy as np
>>> arr = np.arange(15).reshape(5, 3)
>>> t = Table(arr, names=('a', 'b', 'c'), meta={'keywords': {'key1': 'val1'}})

データ値を修正する **

>>> t['a'][:] = [1, -2, 3, -4, 5]  # Set all column values
>>> t['a'][2] = 30                 # Set row 2 of column 'a'
>>> t[1] = (8, 9, 10)              # Set all row values
>>> t[1]['b'] = -9                 # Set column 'b' of row 1
>>> t[0:3]['c'] = 100              # Set column 'c' of rows 0, 1, 2

Note that table[row][column] assignments will not work with numpy "fancy" row indexing (in that case table[row] would be a copy instead of a view). "Fancy" numpy indices include a list, numpy.ndarray, or tuple of numpy.ndarray (e.g., the return from numpy.where):

>>> t[[1, 2]]['a'] = [3., 5.]             # doesn't change table t
>>> t[np.array([1, 2])]['a'] = [3., 5.]   # doesn't change table t
>>> t[np.where(t['a'] > 3)]['a'] = 3.     # doesn't change table t

代わりに使っています table[column][row] 注文::

>>> t['a'][[1, 2]] = [3., 5.]
>>> t['a'][np.array([1, 2])] = [3., 5.]
>>> t['a'][np.where(t['a'] > 3)] = 3.

以下のコマンドを使用してデータ列を修正することもできます unit 慣例に従った方法で設定する Quantity 使用することで quantity 物件::

>>> from astropy import units as u
>>> tu = Table([[1, 2.5]], names=('a',))
>>> tu['a'].unit = u.m
>>> tu['a'].quantity[:] = [1, 2] * u.km
>>> tu['a']
<Column name='a' dtype='float64' unit='m' length=2>
1000.0
2000.0

1列以上の列を追加する

Dict値を付加したものと類似した文法を用いて単一の列を表に追加することができる右側の値は、正しいサイズのリストまたは配列であってもよいし、ブロードキャストされるスカラ値であってもよい。

>>> t['d1'] = np.arange(5)
>>> t['d2'] = [1, 2, 3, 4, 5]
>>> t['d3'] = 6  # all 5 rows set to 6

より明確な制御を行うためには、ご利用ください add_column() そして add_columns() 方法は、テーブルに1つまたは複数の列を追加するために使用されてもよい。この2つの場合、新しい列は、リスト、配列(含む)として指定することができる Column あるいは…。 MaskedColumn )またはスカラー:

>>> from astropy.table import Column
>>> t.add_column(np.arange(5), name='aa', index=0)  # Insert before first table column
>>> t.add_column(1.0, name='bb')  # Add column of all 1.0 to end of table
>>> c = Column(np.arange(5), name='e')
>>> t.add_column(c, index=0)  # Add Column using the existing column name 'e'
>>> t.add_columns([[1, 2, 3, 4, 5], ['v', 'w', 'x', 'y', 'z']], names=['h', 'i'])

最後に、列を追加することもできます Quantity オブジェクト、これは自動的に設定されます .unit リスト上の属性:

>>> from astropy import units as u
>>> t['d'] = np.arange(1., 6.) * u.m
>>> t['d']
<Column name='d' dtype='float64' unit='m' length=5>
1.0
2.0
3.0
4.0
5.0

削除列

表から列を削除するには、以下の操作を実行してください。

>>> t.remove_column('d1')
>>> t.remove_columns(['aa', 'd2', 'e'])
>>> del t['d3']
>>> del t['h', 'i']
>>> t.keep_columns(['a', 'b'])

置換列

既存の列を完全に新しい列に置き換えることができます。方法は、リストの列を初期化するために使用可能な任意のオブジェクト(例えば、リストまたは numpy 配列)。例えば、変更することができます a 列自. int 至る float 使用::

>>> t['a'] = t['a'].astype(float)

右側の値が列状でない場合、例えば、ブロードキャストを使用して定位置更新が行われる。

>>> t['a'] = 1  # Internally does t['a'][:] = 1

重命が列に並ぶ.

名を重用するには、以下の操作を実行してください。

>>> t.rename_column('a', 'a_new')
>>> t['b'].name = 'b_new'

データを1行追加する

行を追加するには、以下の操作を実行してください。

>>> t.add_row([-8, -9])

行を削除する

行を削除するには、以下の操作を実行してください。

>>> t.remove_row(0)
>>> t.remove_rows(slice(4, 5))
>>> t.remove_rows([1, 2])

1列または複数列でソートする

列をソートするには、以下の操作を実行してください。

>>> t.sort('b_new')
>>> t.sort(['a_new', 'b_new'])

反転表行

テーブル行を反転させるには、以下の操作を実行してください。

>>> t.reverse()

メタデータを修正する

メタデータを修正するには、以下の操作を実行してください。

>>> t.meta['key'] = 'value'

列の選択または列の並べ替え

次の例に示すように、列のサブセットまたは並べ替えリストを含む新しいテーブルを作成することができる:

>>> t = Table(arr, names=('a', 'b', 'c'))
>>> t_acb = t['a', 'c', 'b']

同じ動作を実行する別の方法は、以下に示すように、項目としてリストまたはタプルを提供することである。

>>> new_order = ['a', 'c', 'b']  # List or tuple
>>> t_acb = t[new_order]

注意事項.

表データと属性を修正するのは非常に簡単ですが、1行を追加することを覚えておきましょう may メモリに表データの新しいコピーを作成する必要がある。これは、Pythonオブジェクトのメモリ内の詳細なレイアウトに依存し、確実に制御できません。場合によっては、O(N**2)未満の時間にプログレッシブにテーブルを構築することができるが、それを期待することはできない。

もう1つの微妙な点は、場合によっては、動作の返り値がメモリ内に新しいテーブルを生成し、それ以外の場合には、既存のテーブルデータのビューを生成することである。例えば、列選択を用いて2つの表要素を設定しようとすることを想像してみてください t['a', 'c'] 行インデックス選択と組み合わせて使用する:

>>> t = Table([[1, 2], [3, 4], [5, 6]], names=('a', 'b', 'c'))
>>> t['a', 'c'][1] = (100, 100)
>>> print(t)
 a   b   c
--- --- ---
  1   3   5
  2   4   6

データ値が変更されていないし、間違いもないので、これは驚くかもしれない。実際起きていることは t['a', 'c'] メモリに新しい一時表を作成しました copy そしてコピーの最初の行を更新します。原版. t 表は影響を受けず,文が完了すると,新たな一時表が消失する.要点はいくつかの操作がどのように一歩ずつ実行されているかに注意することだ。

在位と置換列更新

以下のコード片を考慮してください:

>>> t = Table([[1, 2, 3]], names=['a'])
>>> t['a'] = [10.5, 20.5, 30.5]

この問題に対処できるいくつかの方法がある。これは、既存の配列値(整数に切断)を定位置で更新することができ、提供されたデータ値に応じて列全体を新しい列で置き換えることもできる。

答えは astropy (バージョン1.3から)は、上に表示された操作実行である 完全に交換する 対象を列記する。本例では、内部呼び出しにより浮動小数点値を有する新しい列オブジェクトを作成する t.replace_column('a', [10.5, 20.5, 30.5]) それがそうです。一般的に、この行動はPythonとPandas行動とより一致する。

Forcing in-place update

列の定位置更新を強制実行することができるのは,以下のとおりである.

t[colname][:] = value

問題の根源を探る

置換列に関する潜在的な問題を探すために,構成オプションがある table.conf.replace_warnings それがそうです。これは、場合によってはリスト列を置き換える際に発行される警告のセットを制御する。このオプションは、以下の文字列の値をゼロ個以上含むリストに設定する必要があります。

always

SetItem()構文によって列が置換されるたびに警告(すなわち、 t['a'] = new_col )。

slice

親列スライスの列として表示された場合には,警告を印刷する.

refcount

列のPython参照カウントが変更されると、警告が印刷されます。これは,コード中の他の位置で使用され,意外な結果が生じる可能性のある古いオブジェクトが存在することを示している.

attributes

任意の標準列属性が変更された場合、警告を印刷する。

属性のデフォルト値 table.conf.replace_warnings 選択権は [] (警告はありません)。