pandas DataFrameをdfとして用意します

>>> import pandas as pd
>>> import numpy as np
>>> from datetime import datetime

>>> index = list(range(0,4))
>>> depth = [3.7, -4.8, 6.2, 6.6]
>>> lat = [35.462329, 35.461878, 35.461878, 35.461878]
>>> lon = [139.875752, 139.875751, 139.876302, 139.876853]
>>> mask = [1, 0, 1, 1]
>>> df = pd.DataFrame({"Depth": depth, "Lat": lat, "Lon": lon, "mask": mask}, index=index)
>>> df

   Depth          Lat          Lon   mask
0    3.7    35.462329   139.875752  1
1   -4.8    35.461878   139.875751  0
2    6.2    35.461878   139.876302  1
3    6.6    35.461878   139.876853  1

列Lonをデータフレームとして取り出します

複数の列を取り出すにはdf[['Lon', 'mask']]のようにリストを渡します.df['Lon', 'mask']はエラーとなります.

>>> df[['Lon']]

    Lon
0   139.875752
1   139.875751
2   139.876302
3   139.876853

ただし,1列だけ抽出するには,df['Lat']あるいはdf.Latとすることもできます.これらの場合はDataFrameではなく,Seriesになることに注意が必要です.DataFrameのみを想定しているスクリプトでSeriesが現れるとエラーとなる,わかりにくいバグに注意しましょう.

Depth列が負の値の行を抽出するには条件式を与えます

>>> df[df.Depth < 0]

       Depth          Lat         Lon   mask
1   -4.8    35.461878   139.875751  0

df[df['Depth'] < 0]でも同じです.mask==1を抽出するには同様にdf[df['mask'] == 1]とします.一方,条件式をDataFrameとして抽出すると(カギ括弧をさらに増やす),以下のようになるので,注意が必要です.

>>> df[df[['Depth']] < 0]

    Depth   Lat Lon mask
0    NaN    NaN NaN NaN
1   -4.8    NaN NaN NaN
2    NaN    NaN NaN NaN
3    NaN    NaN NaN NaN

列を追加するには列名を指定してリストを代入します

>>> stn=["A","B","C","D"]
>>> df['stn'] = stn
>>> df

    Depth   Lat Lon mask    stn
0    3.7    35.462329   139.875752  1   A
1   -4.8    35.461878   139.875751  0   B
2    6.2    35.461878   139.876302  1   C
3    6.6    35.461878   139.876853  1   D

列を削除するにdf.drop([‘列名’], axis=1)とします

>>> df.drop(['stn'], axis=1)

        Depth        Lat         Lon    mask
0    3.7    35.462329   139.875752  1
1   -4.8    35.461878   139.875751  0
2    6.2    35.461878   139.876302  1
3    6.6    35.461878   139.876853  1

列名はリストとして与えます.axis=1は列への適用を意味し,axis=0(デフォルト)は行への適用です.また,dfに反映させるには,df.drop('列名', axis=1, inplace=True)のようにinplace=Trueが必要です.

日付時刻文字の列を追加し,datetimeオブジェクトとして認識させます

>>> dt = ["2018-01-02 11:00:00", "2018-03-05 00:00:00", "2018-04-01 16:42:31", "2018-05-13 12:15:30"]
>>> df['datetime'] = pd.to_datetime(dt)

       Depth         Lat         Lon    mask    datetime
0    3.7    35.462329   139.875752  1   2018-01-02 11:00:00
1   -4.8    35.461878   139.875751  0   2018-03-05 00:00:00
2    6.2    35.461878   139.876302  1   2018-04-01 16:42:31
3    6.6    35.461878   139.876853  1   2018-05-13 12:15:30

さらに,今追加したdatetime列をindexにします.

>>> df.set_index('datetime')

                       Depth         Lat         Lon    mask
datetime               
2018-01-02 11:00:00  3.7    35.462329   139.875752  1
2018-03-05 00:00:00 -4.8    35.461878   139.875751  0
2018-04-01 16:42:31  6.2    35.461878   139.876302  1
2018-05-13 12:15:30  6.6    35.461878   139.876853  1

dfを更新するにはinplace=Trueが必要です.

日付時刻の期間の文字列で行を抽出します

>>> df["2018-02":"2018-04"]

                   Depth    Lat Lon mask
datetime               
2018-03-05 00:00:00 -4.8    35.461878   139.875751  0
2018-04-01 16:42:31  6.2    35.461878   139.876302  1

この例では2018年2月から4月の期間で切り出しています.df[1:3]のようにリストのスライスで抽出することもできます.

df.iloc[行index, 列index]でスライスします

>>> df.iloc[1:3, 1:3]

                             Lat    Lon
datetime       
2018-03-05 00:00:00 35.461878   139.875751
2018-04-01 16:42:31 35.461878   139.876302

行と列のインデックスでスライスします.df.iloc[1:3, 1]df.iloc[1:3, 1:2]は共に2行1列を抽出しますが,前者はSeriesに,後者はDataFrameになる点に注意しましょう.

df.loc[行名, [列名]]でスライスします

>>> df.loc["2018-01-01":"2018-01-31", ['Depth']]

                        Depth
datetime   
2018-01-02 11:00:00 3.7

インデックスではなく行名,列名でスライスします.列が1つだけでもリストで与えるとDataFrameを返します.スライスした要素(3.7)に値(0.0)を代入すると置換されます.

>>> df.loc["2018-01-01":"2018-01-31", ['Depth']] = 0.0
>>> df

                        Depth         Lat         Lon   mask
datetime               
2018-01-02 11:00:00  0.0    35.462329   139.875752  1
2018-03-05 00:00:00 -4.8    35.461878   139.875751  0
2018-04-01 16:42:31  6.2    35.461878   139.876302  1
2018-05-13 12:15:30  6.6    35.461878   139.876853  1

df.replace([置換前の値], 置換後の値)で値(または値のリスト)を置換します

>>> df.replace([-4.8], -1.0)

                       Depth    Lat Lon mask
datetime               
2018-01-02 11:00:00  0.0    35.462329   139.875752  1
2018-03-05 00:00:00 -1.0    35.461878   139.875751  0
2018-04-01 16:42:31  6.2    35.461878   139.876302  1
2018-05-13 12:15:30  6.6    35.461878   139.876853  1

より明確に,df.replace(to_replace=[-4.8], value = -1.0)でも大丈夫です.リストなので複数の値を同時に置換できます.データフレームを更新するにはinplace=Trueが必要です.また,df.replace()では条件式を使うとはまるので,避けた方がよいでしょう(こちらに解説があります).

df.mask(条件式, 置換する値)で条件式を満たす要素の値を置換します

>>> df['Depth'].mask(df['Depth'] < 0, np.nan, inplace=True)

                  Depth          Lat    Lon    mask
datetime               
2018-01-02 11:00:00 0.0 35.462329   139.875752  1
2018-03-05 00:00:00 NaN 35.461878   139.875751  0
2018-04-01 16:42:31 6.2 35.461878   139.876302  1
2018-05-13 12:15:30 6.6 35.461878   139.876853  1

Depth列が負の値を欠損値としてNaNに置換しました.データフレーム自体を更新するには第3引数にinplace=Trueを指定します.df[['Depth']]のようにDataFrameで切り出しても問題ありません.

列の順番を入れ替えるには列名のリストを渡します

>>> df[['Lat', 'Lon', 'Depth', 'mask']]

                    Lat         Lon        Depth    mask
datetime               
2018-01-02 11:00:00 35.462329   139.875752  0.0 1
2018-03-05 00:00:00 35.461878   139.875751  NaN 0
2018-04-01 16:42:31 35.461878   139.876302  6.2 1
2018-05-13 12:15:30 35.461878   139.876853  6.6 1

要素がobjectのDataFrameを用意します

見た目は数値でありながら,objectとなっている場合に,数値として扱う方法です.

>>> num_str = ['1.0', '2.0', '3.0', '4.0']
>>> df['num_str'] = num_str
>>> df

                  Depth       Lat         Lon   mask    num_str
datetime                   
2018-01-02 11:00:00 0.0 35.462329   139.875752  1   1.0
2018-03-05 00:00:00 NaN 35.461878   139.875751  0   2.0
2018-04-01 16:42:31 6.2 35.461878   139.876302  1   3.0
2018-05-13 12:15:30 6.6 35.461878   139.876853  1   4.0

>>> df['num_str'].values
array(['1.0', '2.0', '3.0', '4.0'], dtype=object)

見た目では分かりませんが,num_str列dtypeobject[cci]です.なお,[cci_python].valuesSeriesnumpyarrayに変換しています.df[['num_str']]とするとDataFrameとなり,これに.valuesを適用すると,リストを要素にもつリストとなって,扱いにくくなります.

.astype()で実数に変換します

>>> df['num_str'].astype(np.float64).values
array([1., 2., 3., 4.])

実数のnumpy arrayに変換されました.データフレームを更新するには代入します.

>>> df['num_str'] = df['num_str'].astype(np.float64)

Seriesで扱いましたが,二重のカギ括弧にしてDataFrameとしても大丈夫です.