Help us understand the problem. What is going on with this article?

pandasの基本操作

More than 1 year has passed since last update.

pandasについて

pandasはnumpyを基にしたデータ操作なので,numpyの操作がそのまま使えるので便利.ただ,馴れるまで行・列の取り出した方法が分かりにくい.まだまだ不馴れなので,記しておく.

DataFrameとSeries

pandasにはDataFrameとSeriesの2種類のデータ形式がある.前者は二次元データ,後者は一次元データである.基本的に,Seriesは使うことがあまり無いので,DataFrameを中心に説明する.DataFrameから一つのcolumnを指定して取り出した場合,それはSeries型となる.

# DataFrame
   foo  bar
a    0    1
b    2    3
c    4    5

# Series
a    0
b    2
c    4

DataFrameの操作

indexとcolumn

DataFrameには,要素の位置情報として,n行目m列目といったnumpyのような要素番号と,indexとcolumnによるユーザー定義の要素指定が可能である.
特に指定しなければ,番号が割り当てられるが,そのような使い方ではnumpyと変わらないので,実用上は使われないような.個人的には,indexは番号で良いかという気もする.

indexとcolumnsの指定

indexとcolumnsを指定する場合は以下のようにすればよい.

df.columns = ['foo', 'bar']
df.index = ['a', 'b', 'c']

また,DataFrameのindexやcolumns名を確認する場合は以下のように.

df.columns
df.index
df.info() # columns, index, memory usage

最もシンプルな列の抽出

DataFrameでは,__getitem__の取り方での指定は,columnsの指定である.また,列番号でも取り出せるが,その場合は単一でもリスト型で指定する必要がある.ただ,この方法ではindexの行番号(index)の指定は出来ない.
Seriesの場合は,__getitem__でindex指定となる.columnsが一つしかないから自然だが.

df['foo'] or df[[0]]  # designate single column
df[['foo', 'bar']] or df[[0, 1]] # designate multi columns

より詳細な抽出(ix, iloc, loc)

DataFrame上の要素の位置情報として,行列の要素番号とユーザー定義の名前があると上述した.どちらで取り出しているのかを明示するために,ix,iloc,locの3種類がある.
ilocは番号の指定のみに対応,locは名前のみ,ixは両方で指定可能である.上の例を取れると,[0,0]を取りたい場合は,以下のように書ける.

df.ix[[0], [0]]
df.ix[[0], ['foo']]
df.ix[['a'], ['foo']]
df.ix[['a'], [0]]
df.iloc[[0], [0]]
df.loc[['a'], ['foo']]

因みに,複数のインデックスを指定する場合は以下のようにすれば良い.

df.ix[:, [0]]   # 全て
df.ix[1:5, [0]] # 範囲指定
df.ix[:]        # indexのみの指定

指定条件からの行・列の抽出

行の抽出

指定列の中からある条件を満たす行を抽出する方法。その列のすべての列が出力される。

print foo.loc[foo['bar'] == condition]

列の抽出

間接的な方法で、条件を満たさない要素をNaNにして、続いてNaNを含む列を削除する。

foo = foo[foo == 1] # 条件を満たさない要素はすべてNaNになる。
foo = foo.dropna(axis=1)

イテレータ

pd.DataFrameの各列に対してイテレートする場合。

for index, rows in df.iterrows():
    print index, rows # rows: pd.DataFrameとなっている。

pd.DataFrameを作成・編集する.

# 器だけ作成する場合
foo = pd.DataFrame(columns=['bar', 'baz'])

foo = pd.DataFrame({'bar': [0, 1, 2],
                    'baz': [3, 4, 5]}
                    index=['a', 'b', 'c'])
# foo
    bar  baz
a    0    3
b    1    4
c    2    5

列を追加する

列を新たに追加する方が行を追加するよりも簡単.

foo['qux'] = [6, 7, 8]
# foo
    bar  baz  qux
a    0    3    6
b    1    4    7
c    2    5    8

行を追加する

foo = foo.append(pd.DataFrame({'bar': [6, 7], 'baz': [8, 9]}, index=['d', 'e']))
# foo
# indexを修正したければ自分で指定する必要がある。
    bar  baz
a    0    3
b    1    4
c    2    5
d    6    7
e    8    9

行および列を削除する。

foo.drop('e')
foo.drop('bar', axis=1) # 列を削除する。
del foo['bar'] # 列を削除する。(pythonのdelを利用している。)

参考URL
http://stackoverflow.com/questions/17071871/select-rows-from-a-dataframe-based-on-values-in-a-column-in-pandas

referenced URL:
http://sinhrks.hatenablog.com/entry/2014/11/12/233216

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした