2023.03.15
Time Series 機械学習のためのPython必須ライブラリ、Pandas 1編
2.2 Time Series 機械学習のためのPython必須ライブラリ、Pandas 1編
Pandasとは?
Python Data Analysis Libraryの略語であり、Rをモチーフにして作られたPythonライブラリです。簡単で直感的なリレーショナルまたは分類されたデータで作業できるように設計された、高速で柔軟で表現力豊かなデータ構造を提供しています。Pandasが必要な理由は、Numpyのndarrayデータ構造は算術演算作業でフォーマットがよく整理されたデータ型のための機能を提供しているが、現実データは思ったより整然としていないからだ。Pandasはデータをテーブル形式で処理することができ、収集されたデータの前処理など、各種データの取り扱いを容易かつ楽にすることができる。そのため、データ分析を行うにはPandasも必須です。
2.2 シリーズ
リスト、タプル、ディクショナリなど複数のオブジェクトを収めることができる1次元配列のようなデータ構造である。
2.2.1.1 seriesデータの生成
seriesの場合、複数のデータ型にすることができますが、実習を通じて調べてみましょう。
1. 辞書でシリーズを作る
ディクショナリのキー値がindexで、value値がcell値に入ったことがわかり、 seriesはディクショナリと構造が似ていると見ることができる。
in [2]:
import pandas as pd
dict_data = {'a':1, 'b':2, 'c':3}
series_data = pd.Series(dict_data)
print(series_data)
print(type(series_data))
Out [7]:
print(series_data.index)
Out [9]:
print(series_data.values)
Out [11]:
2. リストにする
リストで作成する場合、辞書とは異なり、key 値がない順序型データ型であるため、インデックスは自動的に 0 から付与される.
list_data = [2,4,6,8]
series_data = pd.Series(list_data)
print(series_data)
Out [15]:
print(series_data.index)
Out [17]:
print(series_data.values)
Out [19]:
タプルの場合でも series で作るときのリストと結果の違いはない。
tuple_data = (2,4,6,8)
series_data = pd.Series(tuple_data)
シリーズデータからdictタイプにも変更が可能.
print(series_data.to_dict())
Out [23]:
2.2.1.2 辞書のようにインデックスを指定して series オブジェクトを生成する方法
Pandasの場合、indexの値を直接変更できます。
In [24]:
series_data = pd.Series(list_data, index = ['a','b','c','d'])
print(series_data)
Out [26]:
2.2.2 Dataframe
Dataframe は 1 つの列が series で多数が集まって dataframe (2 次元) となる。 データフレームで1列しかインポートされない場合は、それはseries(1次元)です。 そして dataframe は表のようなスプレッドシート形式のデータ構造である。
2.2.2.1 dataframe 作成
Dataframeもいくつかの方法で作成できます。
1. 辞書にする
辞書の中にあるkey、valueがそれぞれのseriesであり、keyはcolumnの名前になる。
dict_data = {'c0':[1,2,3], 'c1':[4,5,6],'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
df = pd.DataFrame(dict_data)
print(df)
print(type(df))
2. リストにする
リストでデータフレームを作成すると、リストは1行と列になります。
Series と同様に、values プロパティは dataframe に格納されたデータを 2 次元配列として返します。
Dataframeも同様にディクショナリに変更が可能だ。
df = pd.DataFrame([[14,'남'],[17,'여']],
index = ['a','b'],
columns = ['나이','성별'])
print(df)
print('------')
print(df.index)
print('------')
print(df.values)
print('------')
print(df.to_dict())
Out [32]:
print(df)
print('------')
print(df.index)
print('------')
print(df.values)
print('------')
print(df.to_dict())
SeriesとDataframeをまとめると、ディクショナリにすることになったときにデータフレームの列を一つずつ積み重ねていく形で、リストで作れば行をひとつずつ積み重ねていく形だと見ることができる。
2. dataframe 操作
1. 列を追加する
既存のデータフレームに新しい列を追加することは、大きなデータセットを操作するときによく使用されます。 このとき、リストをデータフレームの行または列に追加するには、サイズ(長さ)が同じでなければならず、そうでなければエラーが発生します。 しかし、Series を追加することになった時は、その index に存在しない場合には欠測値(Nan)が入るようになる。
city = ['ソウル', '分あたり]
df['地域'] = city
print(df)
df.insert(2,'키',['170','155'])
print(df)
Out [39]:
df['키'] = ['170']
Out [41]:
df = df.assign(도시 = city)
df.loc[:,'도시'] = city
どちらもindexオブジェクトです。 簡単に変更するには、数に合わせて指定するだけで簡単に変更できます。
print(df.index)
df.index = ['c','d']
print(df)
3. Rename()関数の使用
上記の方法のようにするにはリストに渡すので、長さだけ入力をしてくれなければならない。 そのようになったときに長さが合わない、またはインデックスを重複して入れる場合が生じることがあるので、関数を通じて変更するのが良い。 rename(columns={変更前の列名、変更後の列名}、inplace=True)として使用でき、inplace=Trueでオプションを与えれば別に変数に入れずにすぐに適用が可能です。
df.rename(columns={'年齢':'年齢','性別':'男女'}, inplace=True)
print(df)
Out [50]:
4. Drop() 行を削除
上記のようにindexまたはcolumnsを指定してもよいし、axis = 0 or 1で軸を指定してくれても使うこともできる.
df2 = df.copy()
df2.drop(columns='키', inplace = True)
print(df2)
Out [53]:
df2.drop(index='d', inplace = True)
print(df2)
さらにdel予約語を介してdel df[‘列名’または‘インデックス’]にも削除が可能です。
2.2.2.3 条件を追加して抽出してみる
df = pd.DataFrame([[14,'남'],[17,'여'],[24,'남'],[20,'여'],[15,'남'],[21,'여']],
index = ['a','b','c','d','e','f'],
columns = ['나이','성별'])
print(df)
Out [58]:
ただ条件だけ甘くなれば numpy の mask のように series 型(固定された長さ)で出るようになる.
print(df['나이'] > 20)
print(df[df['나이'] > 20])
Out [62]:
