Python > Pandasの使い方

更新日 2019-08-16
広告
基本的に、以下のデータ"AirPassengers.csv"をサンプルとして説明します。 このデータは色々なところで勉強用に使われています。 例えば、ここに、データがあります。 1列目(Month)が「年月」で、2列目(#Passengers)が乗客数のデータです。
Month,#Passengers
1949-01,112
1949-02,118
1949-03,132
1949-04,129
1949-05,121

CSVデータの読み込み

CSVデータの読み込み方法です。 単純には、以下のように読み込めます。
data = pd.read_csv('AirPassengers.csv', parse_dates=[0], dtype={1:'float'})
  • ファイル名を指定
  • 1列目は日付なので、parse_datesパラメータに1列目(0)を指定
  • 2列目は数値データなので、データ型を'float'に指定。指定しないと、文字列型になる。
以下のように、日付のパーサを定義することも可能です。
dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m')
data = pd.read_csv('AirPassengers.csv', index_col='Month', date_parser=dateparse, dtype='float')
以下のように、1列目をインデックス列として指定することも可能です。
data = pd.read_csv('AirPassengers.csv', index_col='Month', dtype={1:'float'})
read_csvは、data frameオブジェクトを返します。 data frameは、CSVファイルの行と列を二次元配列で管理しているオブジェクトだと思うとよいです。 単なる二次元配列と違って、特定の行や列を取得したりすることが、簡単にできるようになっています。
data = pd.read_csv(csvFile, index_col='date', parse_dates=True, dtype={"id": str})
上の例は、date列をインデックスとして、かつ、文字列を日付として解析するよう指定しています。また、id列の値を文字列として読み込むようdtypeで指定しています。

カラム名を指定してDataFrameを作成

CSVファイルを読み込まなくても、DataFrameを作ることはできます。
  df = pd.DataFrame(columns=colNames)
  df.set_index("id", inplace=True)
上記例では、列名としてcolNames変数(列名の配列)を指定して、DataFrameを作成しています。 そのあと、set_indexメソッドで、"id"列をインデックスとして扱うよう指定しています。

カラム名を取得する。

DataFrameの列名を取得するには、以下のようにします。
  colNames = df.columns.values

time series(列)の取得

data frameからtime series(特定の列)を取得するには、以下のように、列のラベルを指定する方法があります。
ts = data['#Passengers']

行の取得

特定の行を検索して、取得することができます。 例えば、以下は、乗客数が300よりも大きい行を取得します。
target = data[data['#Passengers'] > 300]
以下は、timestamp列に値(時刻)が、2018年1月1日以降の行を取得します。(timestampという名前の列がある前提です)
target = data[data['timestamp'] > '2018-01-01 00:00:00']
インデックスを指定して、行を取得することもできます。 データを読み込むときに、index_colを指定しなければ、インデックスとして連番が割り当てられます。 そのときは、数値で指定できます。 以下は、30番目までの行を全て取得する例です。
target = data[:30]
以下のようにすると、30番目以降の行を取得します。
target = data[30:]
以下のようにすると、30番~40番の行を取得します。コロンの左側が開始条件で、右側が終了条件です。
target = data[30:40]
インデックスが時刻であれば、以下のように、時刻で範囲してい可能です。
target = data[:'2018-03-01 00:00:00']

forループ

DataFrameをforループで一行ずつ取得する方法は以下となります。
  for index, row in self.result.iterrows():
    result = row[RESULT]

DataFrameに列を追加

DataFrameに列を追加する場合は、以下のようにassignメソッドを使います。
  newDf = df.assign(**{columnName : newColumn })
assignメソッドでは、新しいDataFrameが返されます。 上の例で、columnName変数は、列名です。newColumn変数は、追加したい列の配列になります。

DataFrameに行を追加

  newDf = df.append(pd.Series(newRow, index=df.columns, name=date))
newRow変数が、追加したい行の配列になります。 このnewRow配列のサイズが、df変数(追加しようとしているDataFrame)の列数と一致していないと、エラーになります。 引数nameには、追加したい行の、インデックス値を指定する。上の例では、dateという変数に、インデックス値を格納してあります。

DataFrameを結合

concatメソッドを使います。 以下のように、二つのDataFrame変数を結合して、新しいDataFrameを作成します。
  targetResourceDf = pd.concat([targetResourceDf, tmpDf])

クエリによる検索

queryメソッドを使うことで、検索条件に一致する行を取得できます。
  date = "2022-04-01"
  x = 150

  resultDf = df.query("date == @date & value == @x")
  if resultDf.empty:
    print("データは見つかりませんでした")
検索条件は文字列で指定します。アットマークから始めることで、条件の中に変数を入れられます。 上記の例では、date列の値が2022-04-01で、value列の値が150である行を探します。 複数の行がマッチする場合は、複数の行が返されます。

差分の取得

time seriesのdiffメソッドを使うと、「値の差分」のtime seriesを取得できます。
diff = ts.diff()
差分というのは、隣り合う要素(値)の差のことです。 以下のように、shiftメソッドを使うことでも計算できます。
diff = ts - ts.shift()

time seriesの結合

以下のように、concatメソッドに、結合したいtime seriesを配列として渡してやることで、結合されたtime seriesを得ることができます。
ts = pd.concat([ts1, ts2])

NaNの削除

time seriesの中のNaN要素を削除するには、dropnaメソッドを使います。
diff = diff.dropna()

NaNを0に置換する。

fillnaメソッドを使います。
resultDf = df.fillna(0) # nanを0で埋める。
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system