Pandas活用のための基礎 (動画あり)

AI

Pandasはかなり強力なデータ集約やグループ化の手法が用意されています。
今回はそれらのごく簡単な扱い方の説明です。

Pandas活用1
スポンサーリンク

Pandasのデータ操作の基本

pandasとnumpyのインポート
これらはPythonのデータ分析では必須となりますので、まずインポートしておくと良いでしょう。

import pandas as pd
import numpy as np

簡単なDataFrame例の作成。

attri_data = {'ID':['100', '101', '102', '103','104'],
              'City':['Tokyo', 'Osaka', 'Kyoto', 'Hokkaido', 'Tokyo'],
              'Birth_year':[1990, 1989, 1992, 1997, 1982],
              'Name':['Hiroshi', 'Hanako', 'Yuki', 'Satoru', 'Steve']}

attri_data_frame1 = pd.DataFrame(attri_data)
attri_data_frame1

結果

ID City Birth_year Name
0 100 Tokyo 1990 Hiroshi
1 101 Osaka 1989 Hanako
2 102 Kyoto 1992 Yuki
3 103 Hokkaido 1997 Satoru
4 104 Tokyo 1982 Steve

比較演算子を使ったデータの抽出

データの抽出は取り出した列に対して比較演算子で比較します。
その結果ブール値が返されます。

attri_data_frame1['City']

結果
1 Osaka
2 Kyoto
3 Hokkaido
4 Tokyo
Name: City, dtype: object

attri_data_frame1['City'] == 'Tokyo'

結果
1 False
2 False
3 False
4 True
Name: City, dtype: bool

論理演算

Bit演算子を使うと論理演算できます。

# 論理積(AND)
(attri_data_frame1['City'] == 'Tokyo') & (attri_data_frame1['Name'] == 'Satoru')

結果
0 False
1 False
2 False
3 False
4 False
dtype: bool

# 排他的論理和(XOR)
(attri_data_frame1['City'] == 'Tokyo') ^ (attri_data_frame1['Name'] == 'Satoru')

結果
0 True
1 False
2 False
3 True
4 True
dtype: bool

# 論理和(OR)
(attri_data_frame1['City'] == 'Tokyo') | (attri_data_frame1['Name'] == 'Satoru')

結果
0 True
1 False
2 False
3 True
4 True
dtype: bool

条件付き抽出をしてTrueの値だけ表示

Trueが返されたデータだけ表示したい場合は、比較内容をもう一度ブラケットで囲みます。
この方法はNumpyでも同様なことができます。

attri_data_frame1[attri_data_frame1['City'] == 'Tokyo']

結果

ID City Birth_year Name
0 100 Tokyo 1990 Hiroshi
4 104 Tokyo 1982 Steve

DataFrame.isin()の使い方

DataFrameの各要素が引数に入れたリストや辞書の値に含まれるかどうか調べてくれます。
isinで調べる内容が[]に入っていることに注意

attri_data_frame1[attri_data_frame1['City'].isin(['Tokyo', 'Osaka'])]

結果

ID City Birth_year Name
0 100 Tokyo 1990 Hiroshi
1 101 Osaka 1989 Hanako
4 104 Tokyo 1982 Steve
attri_data_frame1[attri_data_frame1['Birth_year'] < 1990]

結果

ID City Birth_year Name
1 101 Osaka 1989 Hanako
4 104 Tokyo 1982 Steve

データの削除と結合

axisの値が0なら行で、1なら列を表します。
* 削除:drop
* 結合:merge

attri_data_frame1.drop(['Birth_year'], axis = 1)

結果

ID City Name
0 100 Tokyo Hiroshi
1 101 Osaka Hanako
2 102 Kyoto Yuki
3 103 Hokkaido Satoru
4 104 Tokyo Steve
attri_data_frame1.drop([0], axis = 0)

結果

ID City Birth_year Name
1 101 Osaka 1989 Hanako
2 102 Kyoto 1992 Yuki
3 103 Hokkaido 1997 Satoru
4 104 Tokyo 1982 Steve
attri_data_frame1

結果

ID City Birth_year Name
0 100 Tokyo 1990 Hiroshi
1 101 Osaka 1989 Hanako
2 102 Kyoto 1992 Yuki
3 103 Hokkaido 1997 Satoru
4 104 Tokyo 1982 Steve
# 本当に元データを削除したい場合はinplace = True
attri_data_frame1.drop([0], axis = 0, inplace = True)
attri_data_frame1

結果

ID City Birth_year Name
1 101 Osaka 1989 Hanako
2 102 Kyoto 1992 Yuki
3 103 Hokkaido 1997 Satoru
4 104 Tokyo 1982 Steve

DataFrameのマージについて

合致するデータのみ結合されます。

merge関数の例

# 別のデータの準備
attri_data2 = {'ID':['100', '101', '102', '105', '107'],
               'Math':[50, 43, 33, 76, 98],
               'English':[90, 30, 20, 50, 30],
               'Sex':['M', 'F', 'F', 'M', 'M']}
attri_data_frame2 = pd.DataFrame(attri_data2)
attri_data_frame2

結果

ID Math English Sex
0 100 50 90 M
1 101 43 30 F
2 102 33 20 F
3 105 76 50 M
4 107 98 30 M
pd.merge(attri_data_frame1,attri_data_frame2)

結果

ID City Birth_year Name Math English Sex
0 101 Osaka 1989 Hanako 43 30 F
1 102 Kyoto 1992 Yuki 33 20 F

基本統計量として使える便利な関数

attri_data_frame2['Math'].sum()

結果
300

attri_data_frame2['Math'].mean()

結果
60.0

attri_data_frame2['Math'].max()

結果
98

attri_data_frame2['Math'].min()

結果
33

DataFrameのグループ化

groupby()を使うとグループ集計できます。

attri_data_frame2.groupby('Sex')['Math'].mean()

結果
Sex
F 38.000000
M 74.666667
Name: Math, dtype: float64

DataFrameのソート

  • sort_index() :インデックスでソート
  • sort_values():値でソート

降順は ascending=True を引数に指定します。

# データの準備
attri_data2 = {'ID':['100', '101', '102', '103', '104'],
               'City':['Tokyo', 'Osaka', 'Kyoto', 'Hokkaido', 'Tokyo'],
               'Birth_year':[1990, 1989, 1992, 1997, 1982],
               'Name':['Hiroshi', 'Hanako', 'Yuki', 'Satoru', 'Steve']}
attri_data_frame2 = pd.DataFrame(attri_data2)
attri_data_frame_index2 = pd.DataFrame(attri_data2,index=['e', 'b', 'a', 'd', 'c'])
attri_data_frame_index2

結果

ID City Birth_year Name
e 100 Tokyo 1990 Hiroshi
b 101 Osaka 1989 Hanako
a 102 Kyoto 1992 Yuki
d 103 Hokkaido 1997 Satoru
c 104 Tokyo 1982 Steve

インデックスでソートする例

# インデックスでソート
attri_data_frame_index2.sort_index()

結果
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>ID</th>
      <th>City</th>
      <th>Birth_year</th>
      <th>Name</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>a</th>
      <td>102</td>
      <td>Kyoto</td>
      <td>1992</td>
      <td>Yuki</td>
    </tr>
    <tr>
      <th>b</th>
      <td>101</td>
      <td>Osaka</td>
      <td>1989</td>
      <td>Hanako</td>
    </tr>
    <tr>
      <th>c</th>
      <td>104</td>
      <td>Tokyo</td>
      <td>1982</td>
      <td>Steve</td>
    </tr>
    <tr>
      <th>d</th>
      <td>103</td>
      <td>Hokkaido</td>
      <td>1997</td>
      <td>Satoru</td>
    </tr>
    <tr>
      <th>e</th>
      <td>100</td>
      <td>Tokyo</td>
      <td>1990</td>
      <td>Hiroshi</td>
    </tr>
  </tbody>
</table>

インデックスでソート(逆順)

attri_data_frame_index2['Birth_year'].sort_values(ascending=False)

結果
d 1997
a 1992
e 1990
b 1989
c 1982
Name: Birth_year, dtype: int64

DataFramenの値の条件合致の比較

attri_data_frame_index2.isin(['Tokyo'])

結果

ID City Birth_year Name
e False True False False
b False False False False
a False False False False
d False False False False
c False True False False

NaN挿入

意外と知らないで困るNaNの作り方です。
NaNを値にしたい場合は、np.nanを使います。

import numpy as np
attri_data_frame_index2['Name'] = np.nan
attri_data_frame_index2

結果

ID City Birth_year Name
e 100 Tokyo 1990 NaN
b 101 Osaka 1989 NaN
a 102 Kyoto 1992 NaN
d 103 Hokkaido 1997 NaN
c 104 Tokyo 1982 NaN

参考になった書籍

Pandasの使い方が超基礎と活用に分けて書かれています。
教師あり学習と教師なし学習がうまく網羅されているが全般に説明は非常にあっさりした解説です。超初心者には不向きかもしれませんが、教材に使うのは良いと思う。今回の内容はこの本のPandasの基礎の章を参考にしています。

Pythonサンプルのダウンロード

ここでダウンロードする「Pandas_video_dataframe2.ipynb」ファイルは、このPandas動画で使用したものです。

Pandas_video_dataframe2.ipynb

タイトルとURLをコピーしました