Pandasはかなり強力なデータ集約やグループ化の手法が用意されています。
今回はそれらのごく簡単な扱い方の説明です。
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()
[python]
結果
<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>
インデックスでソート(逆順)
[python]
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動画で使用したものです。

