BETA

pandasを勉強してみる!

投稿日:2019-11-26
最終更新:2019-11-26

はじめに

現在、研究のデータを分析する必要があるのですが
どうしてもExcelを触る気になりません。(面倒な作業やショートカットが多いので)

そこで、Pythonのpandasというライブラリを利用して
よりデータの分析がしやすいように勉強していこうと思います。

pandasとは?

pandasは、Pythonが科学技術計算用の言語であるといわしめるライブラリの一つです。
データの前分析などを行うことが出来ます。

他のDB・ファイル・CSVからファイルの取得を行い
便利な二次元格子上で、データ分析やいらない外れ値の処理などを効率的に行うことが出来ます。

内部構造は、C言語やCythonで書かれているようなため、高速なのも嬉しいです。

pandas実行環境

pandasの実行環境はDocker上のイメージを利用することにしました。
https://qiita.com/fuku_tech/items/6752b00770552bf4f46b
上記のサイトを参考にさせていただきました。

DataFrameを作ってみる

まず、pandasを利用するには

import pandas as pd  

をして、読み込み必要があります。

そして、DataFrameというインスタンスを生成する
というのがPandasの主な流れです。

このDataFrameは、二次元配列の添字が文字列みたいな
データ構造のようです。
まずは、宣言自体をしてみます。

df_liver = pd.DataFrame({  
    'name': [  
        '卯月コウ',  
        'リリム',  
        'チャイカ',  
        '月ノ美兎'  
    ],  
    'age':[  
        15,  
        12,  
        200,  
        16  
    ],  
    'like':    [  
        'pokemon',  
        'human',  
        'eruhu',  
        'mukade'  
    ]  
})  

df_liver  

df_liverというインスタンスを生成しています。

どうやら自動的に0, 1, 2の添字が追加され
各行にデータを設定するようです。

Notebook上では以上のように描画されます。

基本的には、どうやら縦方向
つまりキーであるname, ageなどに操作が行われるようです。

dataframe[キー名]でそのキーに関するデータコラムのみ取り出せます。

進路変更

ここまで来てだが、内容がよくわからなくなったため、
Pandasを使ったデータ操作の基本

を参考にすることにする。

csvファイルの読み込み

Survived,Pclass,Sex,Age,Fare,Embarked  
1,1,male,80.0,30.0,S  
1,2,female,4.0,39.0,S  
0,2,female,24.0,13.0,S  
0,2,male,37.0,26.0,S  
0,3,female,11.0,31.275,S  
1,3,female,13.0,7.2292,C  
0,3,male,22.0,7.25,S  

以上のデータを利用する。
これはタイタニックが沈没した際の登場者のデータらしく
これを利用して、ある人間が沈むか?助かるか?の生存予測をするコンペがあり
それのデータらしい。

  • Survived: 助かるか?
  • Pclass: 部屋のグレード
  • Sex: 性別
  • Age:年齢
  • Fare: 乗り物代金
  • Embarked: 登場した港

を表す。

まず、データを読み込む。

titanic_df = pd.read_csv('sample.csv')  

これは以下のようなデータで描画される。

DataFrameは
DataFrame[データのID 0~N-1][キー(特性)]で表される。

元データでは、データのIDは振られておらず
ただのキーしかないことに注意。

ここで、df.shape = (7, 6)のようにデータ数 キー
と描画されるが、
添字で取り出せるのは
df['Age']のようにキーであることに注意する。

カラム

RowとColumnがあるが
Rowは行で、Columnは列である。

titanic_df.columns  
# Index(['Survived', 'Pclass', 'Sex', 'Age', 'Fare', 'Embarked'], dtype='object')  

columnsというプロパティに、カラムのキーが入っている。
Rowはただの添字であるため、取り出せない。

列を取り出す

列を取り出すには、DFインスタンスの添字にキーを指定すればいい。
するとSeriesという一次元データが取り出せる。

titanic_df['Age']  
0    80.0  
1     4.0  
2    24.0  
3    37.0  
4    11.0  
5    13.0  
6    22.0  
Name: Age, dtype: float64  

操作を行う

条件にあったRow行を取り出すには

  1. query
  2. bool配列をキーにする

が利用できる。

queryでは

titanic_df.query('Age > 10')  

のようにキー名と、その制約を書くことで、その制約にあった
行を取り出してくれる。

ここで大事なのが
カラム・列に関する値の制約を書くことで、行を絞り込む
ということである。

行を取り出す

添字で行を取り出したいときもあるため、
それを行う。

titanic_df.loc[2]  
titanic_df.loc[2:5]  
titanic_df[2:]  

などで、行を取り出せる。

基本的にはlocプロパティを利用して取り出すが
もし2:のように「キーではない!」と一発で分かるなら、そのまま書ける。
titanic_df[2]が書けないのは、おそらくカラムのキーに2が来る可能性があるからである。

グループ化する

同じ値は、グループにまとめることができる。
ただし、グループにまとめる基準のキーは良いが
それ以外の値はいわゆる浮いてしまうため、集約関数を利用する必要がある。

titanic_df.groupby('Survived').mean()  

以上のようにすると、Survivedカラムで同じ値をグループ化し
ただし、値が浮いてしまうため平均値を撮って浮いた値を丸め込んでいる。

reset_indexをすると新しいDataFrameとして扱える。

新しい列を追加する

行は追加することあるのだろうか...
(接合する時ぐらい?)

列を追加するにはassignというメソッドを使い

df.assign(  
    キー名 = Series  
)  

とする。

上記のようにコードすれば良い。

値の書き換え

値の書き換えは以下のように行う

df.loc[行の添字列,  [キー]] = 新しい値  

よって、

titanic_df.loc[titanic_df['Survived'] == 1, ['Embarked']] = 20  

とすると、Survivedが1の添字列を取り出し

0 True
1 True
2 False
3 False
4 False
5 True
6 False
Name: Survived, dtype: bool

それにあったデータを取り出したあとで、['Embarked]の値に20を入れている

そういえば各データは

titanic_df['Age'][0]  

で取り出せる。なぜなら
titanic_df[Age]でSeries型が取り出せて、その後で0番目を習得する、としているためである。

ここまでのソースコード

#!/usr/bin/env python  
# coding: utf-8  

# In[1]:  


import pandas as pd  


# In[2]:  


titanic_df = pd.read_csv('sample.csv')  


# In[3]:  


titanic_df  


# In[4]:  


titanic_df.shape  


# In[5]:  


titanic_df.columns  


# In[7]:  


titanic_df['Age']  


# In[8]:  


titanic_df[['Age', 'Fare']]  


# In[9]:  


titanic_df.query('Age > 10')  


# In[13]:  


titanic_df.query('Survived == 1')  


# In[15]:  


titanic_df[titanic_df['Age'] > 10]  


# In[16]:  


titanic_df[titanic_df['Sex'] == 'male']  


# In[19]:  


titanic_df.loc[2:][titanic_df.loc[2:]['Sex'] == 'male']  


# In[21]:  


titanic_df[2:]  


# In[25]:  


titanic_df.groupby('Survived').mean()  


# In[26]:  


titanic_df.groupby('Survived').mean().reset_index()  


# In[27]:  


titanic_df.assign(One=1)  


# In[28]:  


titanic_df.assign(Two = 2)  


# In[31]:  


titanic_df.assign(  
    is_child = (titanic_df['Age'] < 20).astype(int)  
)  


# In[32]:  


titanic_df.assign(  
    nothing=titanic_df['Fare'] + titanic_df['Age']  
)  


# In[36]:  


titanic_df.loc[titanic_df['Survived'] == 1, ['Embarked']] = 20  


# In[37]:  


titanic_df  


# In[38]:  


titanic_df['Survived'] == 1  


# In[42]:  


titanic_df['Age'][0]  

ここまでの意識

CSVファイルを読み込んで、
それをうまいことキーで指定してまとめて操作できる。
こうすることで、より効率よく操作できそう。

操作は基本的にに対して行う。
列に対しての値で絞り込んで、行を取り出すというイメージ。

列にはlocを使い、あまり使わないことをイメージしよう。

追記

データの詳細を取りだす

df.describe()
で平均値・標準偏差などをスパッと出してくれる

titanic_df.describe()  

    Survived    Pclass    Age    Fare  
count    7.000000    7.000000    7.000000    7.000000  
mean    0.428571    2.285714    27.285714    21.964886  
std    0.534522    0.755929    25.571562    12.726325  
min    0.000000    1.000000    4.000000    7.229200  
25%    0.000000    2.000000    12.000000    10.125000  
50%    0.000000    2.000000    22.000000    26.000000  
75%    1.000000    3.000000    30.500000    30.637500  
max    1.000000    3.000000    80.000000    39.000000  

ソートする

あるカラムの値を基準にソートできる。
おそらく、複数のカラムでソートできる。

titanic_df.sort_values(by=['Age'])  

多分破壊的操作になる。

ある列を消す

del titanic_df['Pclass']  

である列を消せる。
破壊的操作である。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

競プロなどをします。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!