普段、筆者がデータの前処理で使っているpandas
やNumPy
、scikit-learn
などのモジュールの使い方を逆引きのリファレンス形式でまとめました。
一部のサンプルデータや前処理の手法については、データサイエンティスト協会の100本ノック(構造化データ加工編)を参考にさせていただきました。素晴らしいコンテンツをご用意頂いたこと本当に感謝します。
それでは、以下のモジュールをインポートして、この記事をデータ前処理時の辞書代わりにして利用してください。
モジュールのインポート
import numpy as np
import pandas as pd
from sklearn import preprocessing as pp
from sklearn.model_selection import train_test_split
from imblearn.under_sampling import RandomUnderSampler
MEMO
この記事で紹介している全ての前処理は、テーブルの『逆引き』部分をクリックするとモーダルウィンドウが表示され、実際にプログラムの動作を確認することができます。この記事の著者
データサイエンティスト / ブロガー
たぬ
tanu
プロフィール
福岡在住のデータサイエンティスト。Pythonでルーチンワークを瞬殺する仕組みを作ることやデータを視覚化することが得意です。
基本操作
pandas.Series
シリーズを作成する
逆引き | コマンド | 戻り値 |
---|---|---|
1次元配列から作成(インデックスなし) | pd.Series(data=[1次元配列]) | pd.Series |
1次元配列から作成(インデックスあり) | pd.Series(data=[1次元配列], index=[行名のリスト]) | pd.Series |
辞書から作成 | pd.Series(data={'行名': スカラー}) | pd.Series |
1次元配列から作成(インデックスなし)
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=np.random.random(5))
print(s)
# 0 0.226850
# 1 0.259847
# 2 0.360904
# 3 0.532318
# 4 0.680102
# dtype: float64
1次元配列から作成(インデックスあり)
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=np.random.random(5), index=list('ABCDE'))
print(s)
# A 0.226850
# B 0.259847
# C 0.360904
# D 0.532318
# E 0.680102
# dtype: float64
辞書から作成
import pandas as pd
# 辞書からシリーズを作成
d = {'A':1, 'B':2, 'C':4, 'D':8, 'E':16}
s = pd.Series(data=d)
print(s)
# A 1
# B 2
# C 4
# D 8
# E 16
# dtype: int64
シリーズを別の型に変換する
逆引き | コマンド | 戻り値 |
---|---|---|
シリーズ→NumPy配列 | s.values | np.ndarray |
シリーズ→リスト | s.to_list() | list |
シリーズ→辞書 | s.to_dict() | dict |
シリーズ→マークダウン | s.to_markdown() | str |
シリーズ→NumPy配列
サンプルデータ
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=np.random.random(5), index=list('ABCDE'))
print(s)
# A 0.226850
# B 0.259847
# C 0.360904
# D 0.532318
# E 0.680102
# dtype: float64
シリーズ→NumPy配列
print(s.values)
# array([0.22684981, 0.25984664, 0.36090442, 0.5323175 , 0.68010201])
シリーズ→リスト
サンプルデータ
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=np.random.random(5), index=list('ABCDE'))
print(s)
# A 0.226850
# B 0.259847
# C 0.360904
# D 0.532318
# E 0.680102
# dtype: float64
シリーズ→リスト
print(s.to_list())
# [0.22684981458132591,
# 0.25984663734042523,
# 0.3609044189150453,
# 0.5323175047476113,
# 0.6801020126609638]
シリーズ→辞書
サンプルデータ
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=np.random.random(5), index=list('ABCDE'))
print(s)
# A 0.226850
# B 0.259847
# C 0.360904
# D 0.532318
# E 0.680102
# dtype: float64
シリーズ→辞書
print(s.to_dict())
# {'A': 0.22684981458132591,
# 'B': 0.25984663734042523,
# 'C': 0.3609044189150453,
# 'D': 0.5323175047476113,
# 'E': 0.6801020126609638}
シリーズ→マークダウン
サンプルデータ
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=np.random.random(5), index=list('ABCDE'))
print(s)
# A 0.226850
# B 0.259847
# C 0.360904
# D 0.532318
# E 0.680102
# dtype: float64
シリーズ→マークダウン
print(s.markdown())
# | | 0 |
# |:---|---------:|
# | A | 0.22685 |
# | B | 0.259847 |
# | C | 0.360904 |
# | D | 0.532318 |
# | E | 0.680102 |
シリーズから取得する
逆引き | コマンド | 戻り値 |
---|---|---|
インデックスを取得 | s.index | pd.Index |
データ配列の要素数を取得 | s.size | pd.Series |
データ配列の固有値リストを取得 | s.unique() | np.ndarray |
データ配列の固有値の出現回数を取得 | s.value_counts(dropna=False) | pd.Series |
インデックスを取得
サンプルデータ
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=np.random.random(5), index=list('ABCDE'))
print(s)
# A 0.226850
# B 0.259847
# C 0.360904
# D 0.532318
# E 0.680102
# dtype: float64
インデックスを取得
print(s.index)
# Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
データ配列の要素数を取得
サンプルデータ
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=['apple', 'Apple', np.nan, 'APPLE', 'Apple', 'Apple', 'apple'])
print(s)
# 0 apple
# 1 Apple
# 2 NaN
# 3 APPLE
# 4 Apple
# 5 Apple
# 6 apple
# dtype: object
データ配列の要素数を取得
print(s.size)
# 7
データ配列の固有値リストを取得
サンプルデータ
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=['apple', 'Apple', np.nan, 'APPLE', 'Apple', 'Apple', 'apple'])
print(s)
# 0 apple
# 1 Apple
# 2 NaN
# 3 APPLE
# 4 Apple
# 5 Apple
# 6 apple
# dtype: object
データ配列の固有値リストを取得
print(s.unique())
# array(['apple', 'Apple', nan, 'APPLE'], dtype=object)
データ配列の固有値の出現回数を取得
サンプルデータ
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=['apple', 'Apple', np.nan, 'APPLE', 'Apple', 'Apple', 'apple'])
print(s)
# 0 apple
# 1 Apple
# 2 NaN
# 3 APPLE
# 4 Apple
# 5 Apple
# 6 apple
# dtype: object
データ配列の固有値の出現回数を取得
print(s.value_counts(dropna=False))
# Apple 3
# apple 2
# APPLE 1
# NaN 1
# dtype: int64
シリーズのその他の操作
逆引き | コマンド | 戻り値 |
---|---|---|
シリーズをコピー | s.copy() | pd.Series |
データ配列の全要素に処理を適用 | s.apply(lambda x: 処理) | pd.Series |
データ配列の全要素に処理を適用
サンプルデータ
import numpy as np
import pandas as pd
# 1次元配列からシリーズを作成
s = pd.Series(data=['apple', 'Apple', np.nan, 'APPLE', 'Apple', 'Apple', 'apple'])
print(s)
# 0 apple
# 1 Apple
# 2 NaN
# 3 APPLE
# 4 Apple
# 5 Apple
# 6 apple
# dtype: object
データ配列の全要素に処理を適用
print(s.apply(lambda x: True if x=='Apple' else False))
# 0 False
# 1 True
# 2 False
# 3 False
# 4 True
# 5 True
# 6 False
# dtype: bool
pandas.DataFrame
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
1次元配列を値に持つ辞書から作成 | ★★★★★ | pd.DataFrame(data={'列名': [1次元配列]}) | DataFrame |
2次元配列から作成 | ★★★★★ | pd.DataFrame(data=[[2次元配列]], columns=[列名のリスト]) | DataFrame |
行のインデックスを取得 | ★★★★★ | df.index | Index |
列のインデックスを取得 | ★★★★★ | df.columns | Index |
データフレーム→NumPy配列 | ★★★★☆ | df.values | ndarray |
データフレーム→マークダウン | ★★★☆☆ | df.to_markdown() | str |
次元数(行数、列数)を取得 | ★★★★★ | df.shape | tuple |
各列のデータ型を取得 | ★★★★★ | df.dtypes | Series |
データ配列の要約統計量を取得 | ★★★★★ | df.describe() | DataFrame |
データフレームをコピー | ★★☆☆☆ | df.copy() | DataFrame |
データフレームを転置 | ★☆☆☆☆ | df.T | DataFrame |
データ配列の全要素に処理を適用 | ★★★☆☆ | df.applymap(lambda x: 処理) | DataFrame |
1次元配列を値に持つ辞書から作成
import numpy as np
import pandas as pd
d = {
'Name':['Alex', 'Bob', 'Catherine', 'Diana', 'Emma'],
'Score':np.random.randint(1, 100, 5)
}
df = pd.DataFrame(data=d)
print(df)
# Name Score
# 0 Alex 77
# 1 Bob 64
# 2 Catherine 25
# 3 Diana 98
# 4 Emma 99
2次元配列から作成
import numpy as np
import pandas as pd
# 1〜10の値が格納された5行3列の2次元配列
df = pd.DataFrame(data=np.random.randint(1, 11, (5, 3)), columns=list('ABC'))
print(df)
# A B C
# 0 5 8 7
# 1 2 3 9
# 2 4 1 9
# 3 2 1 1
# 4 6 2 8
行のインデックスを取得
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
行のインデックスを取得
print(df.index)
# RangeIndex(start=0, stop=150, step=1)
列のインデックスを取得
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列のインデックスを取得
print(df.columns)
# Index(['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'], dtype='object')
データフレーム→NumPy配列
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
データフレーム→NumPy配列
print(df.values)
# array([[5.1, 3.5, 1.4, 0.2, 'setosa'],
# [4.9, 3.0, 1.4, 0.2, 'setosa'],
# [4.7, 3.2, 1.3, 0.2, 'setosa'],
# [4.6, 3.1, 1.5, 0.2, 'setosa'],
# [5.0, 3.6, 1.4, 0.2, 'setosa'],
# [5.4, 3.9, 1.7, 0.4, 'setosa'],
# [4.6, 3.4, 1.4, 0.3, 'setosa'],
# [5.0, 3.4, 1.5, 0.2, 'setosa'],
# [4.4, 2.9, 1.4, 0.2, 'setosa'],
# [4.9, 3.1, 1.5, 0.1, 'setosa'],
# [5.4, 3.7, 1.5, 0.2, 'setosa'],
# [4.8, 3.4, 1.6, 0.2, 'setosa'],
# [4.8, 3.0, 1.4, 0.1, 'setosa'],
# [4.3, 3.0, 1.1, 0.1, 'setosa'],
# [5.8, 4.0, 1.2, 0.2, 'setosa'],
# [5.7, 4.4, 1.5, 0.4, 'setosa'],
# [5.4, 3.9, 1.3, 0.4, 'setosa'],
# [5.1, 3.5, 1.4, 0.3, 'setosa'],
# [5.7, 3.8, 1.7, 0.3, 'setosa'],
# [5.1, 3.8, 1.5, 0.3, 'setosa'],
# [5.4, 3.4, 1.7, 0.2, 'setosa'],
# [5.1, 3.7, 1.5, 0.4, 'setosa'],
# [4.6, 3.6, 1.0, 0.2, 'setosa'],
# [5.1, 3.3, 1.7, 0.5, 'setosa'],
# [4.8, 3.4, 1.9, 0.2, 'setosa'],
# [5.0, 3.0, 1.6, 0.2, 'setosa'],
# [5.0, 3.4, 1.6, 0.4, 'setosa'],
# [5.2, 3.5, 1.5, 0.2, 'setosa'],
# [5.2, 3.4, 1.4, 0.2, 'setosa'],
# [4.7, 3.2, 1.6, 0.2, 'setosa'],
# [4.8, 3.1, 1.6, 0.2, 'setosa'],
# [5.4, 3.4, 1.5, 0.4, 'setosa'],
# [5.2, 4.1, 1.5, 0.1, 'setosa'],
# [5.5, 4.2, 1.4, 0.2, 'setosa'],
# [4.9, 3.1, 1.5, 0.2, 'setosa'],
# [5.0, 3.2, 1.2, 0.2, 'setosa'],
# [5.5, 3.5, 1.3, 0.2, 'setosa'],
# [4.9, 3.6, 1.4, 0.1, 'setosa'],
# [4.4, 3.0, 1.3, 0.2, 'setosa'],
# [5.1, 3.4, 1.5, 0.2, 'setosa'],
# [5.0, 3.5, 1.3, 0.3, 'setosa'],
# [4.5, 2.3, 1.3, 0.3, 'setosa'],
# [4.4, 3.2, 1.3, 0.2, 'setosa'],
# [5.0, 3.5, 1.6, 0.6, 'setosa'],
# [5.1, 3.8, 1.9, 0.4, 'setosa'],
# [4.8, 3.0, 1.4, 0.3, 'setosa'],
# [5.1, 3.8, 1.6, 0.2, 'setosa'],
# [4.6, 3.2, 1.4, 0.2, 'setosa'],
# [5.3, 3.7, 1.5, 0.2, 'setosa'],
# [5.0, 3.3, 1.4, 0.2, 'setosa'],
# [7.0, 3.2, 4.7, 1.4, 'versicolor'],
# [6.4, 3.2, 4.5, 1.5, 'versicolor'],
# [6.9, 3.1, 4.9, 1.5, 'versicolor'],
# [5.5, 2.3, 4.0, 1.3, 'versicolor'],
# [6.5, 2.8, 4.6, 1.5, 'versicolor'],
# [5.7, 2.8, 4.5, 1.3, 'versicolor'],
# [6.3, 3.3, 4.7, 1.6, 'versicolor'],
# [4.9, 2.4, 3.3, 1.0, 'versicolor'],
# [6.6, 2.9, 4.6, 1.3, 'versicolor'],
# [5.2, 2.7, 3.9, 1.4, 'versicolor'],
# [5.0, 2.0, 3.5, 1.0, 'versicolor'],
# [5.9, 3.0, 4.2, 1.5, 'versicolor'],
# [6.0, 2.2, 4.0, 1.0, 'versicolor'],
# [6.1, 2.9, 4.7, 1.4, 'versicolor'],
# [5.6, 2.9, 3.6, 1.3, 'versicolor'],
# [6.7, 3.1, 4.4, 1.4, 'versicolor'],
# [5.6, 3.0, 4.5, 1.5, 'versicolor'],
# [5.8, 2.7, 4.1, 1.0, 'versicolor'],
# [6.2, 2.2, 4.5, 1.5, 'versicolor'],
# [5.6, 2.5, 3.9, 1.1, 'versicolor'],
# [5.9, 3.2, 4.8, 1.8, 'versicolor'],
# [6.1, 2.8, 4.0, 1.3, 'versicolor'],
# [6.3, 2.5, 4.9, 1.5, 'versicolor'],
# [6.1, 2.8, 4.7, 1.2, 'versicolor'],
# [6.4, 2.9, 4.3, 1.3, 'versicolor'],
# [6.6, 3.0, 4.4, 1.4, 'versicolor'],
# [6.8, 2.8, 4.8, 1.4, 'versicolor'],
# [6.7, 3.0, 5.0, 1.7, 'versicolor'],
# [6.0, 2.9, 4.5, 1.5, 'versicolor'],
# [5.7, 2.6, 3.5, 1.0, 'versicolor'],
# [5.5, 2.4, 3.8, 1.1, 'versicolor'],
# [5.5, 2.4, 3.7, 1.0, 'versicolor'],
# [5.8, 2.7, 3.9, 1.2, 'versicolor'],
# [6.0, 2.7, 5.1, 1.6, 'versicolor'],
# [5.4, 3.0, 4.5, 1.5, 'versicolor'],
# [6.0, 3.4, 4.5, 1.6, 'versicolor'],
# [6.7, 3.1, 4.7, 1.5, 'versicolor'],
# [6.3, 2.3, 4.4, 1.3, 'versicolor'],
# [5.6, 3.0, 4.1, 1.3, 'versicolor'],
# [5.5, 2.5, 4.0, 1.3, 'versicolor'],
# [5.5, 2.6, 4.4, 1.2, 'versicolor'],
# [6.1, 3.0, 4.6, 1.4, 'versicolor'],
# [5.8, 2.6, 4.0, 1.2, 'versicolor'],
# [5.0, 2.3, 3.3, 1.0, 'versicolor'],
# [5.6, 2.7, 4.2, 1.3, 'versicolor'],
# [5.7, 3.0, 4.2, 1.2, 'versicolor'],
# [5.7, 2.9, 4.2, 1.3, 'versicolor'],
# [6.2, 2.9, 4.3, 1.3, 'versicolor'],
# [5.1, 2.5, 3.0, 1.1, 'versicolor'],
# [5.7, 2.8, 4.1, 1.3, 'versicolor'],
# [6.3, 3.3, 6.0, 2.5, 'virginica'],
# [5.8, 2.7, 5.1, 1.9, 'virginica'],
# [7.1, 3.0, 5.9, 2.1, 'virginica'],
# [6.3, 2.9, 5.6, 1.8, 'virginica'],
# [6.5, 3.0, 5.8, 2.2, 'virginica'],
# [7.6, 3.0, 6.6, 2.1, 'virginica'],
# [4.9, 2.5, 4.5, 1.7, 'virginica'],
# [7.3, 2.9, 6.3, 1.8, 'virginica'],
# [6.7, 2.5, 5.8, 1.8, 'virginica'],
# [7.2, 3.6, 6.1, 2.5, 'virginica'],
# [6.5, 3.2, 5.1, 2.0, 'virginica'],
# [6.4, 2.7, 5.3, 1.9, 'virginica'],
# [6.8, 3.0, 5.5, 2.1, 'virginica'],
# [5.7, 2.5, 5.0, 2.0, 'virginica'],
# [5.8, 2.8, 5.1, 2.4, 'virginica'],
# [6.4, 3.2, 5.3, 2.3, 'virginica'],
# [6.5, 3.0, 5.5, 1.8, 'virginica'],
# [7.7, 3.8, 6.7, 2.2, 'virginica'],
# [7.7, 2.6, 6.9, 2.3, 'virginica'],
# [6.0, 2.2, 5.0, 1.5, 'virginica'],
# [6.9, 3.2, 5.7, 2.3, 'virginica'],
# [5.6, 2.8, 4.9, 2.0, 'virginica'],
# [7.7, 2.8, 6.7, 2.0, 'virginica'],
# [6.3, 2.7, 4.9, 1.8, 'virginica'],
# [6.7, 3.3, 5.7, 2.1, 'virginica'],
# [7.2, 3.2, 6.0, 1.8, 'virginica'],
# [6.2, 2.8, 4.8, 1.8, 'virginica'],
# [6.1, 3.0, 4.9, 1.8, 'virginica'],
# [6.4, 2.8, 5.6, 2.1, 'virginica'],
# [7.2, 3.0, 5.8, 1.6, 'virginica'],
# [7.4, 2.8, 6.1, 1.9, 'virginica'],
# [7.9, 3.8, 6.4, 2.0, 'virginica'],
# [6.4, 2.8, 5.6, 2.2, 'virginica'],
# [6.3, 2.8, 5.1, 1.5, 'virginica'],
# [6.1, 2.6, 5.6, 1.4, 'virginica'],
# [7.7, 3.0, 6.1, 2.3, 'virginica'],
# [6.3, 3.4, 5.6, 2.4, 'virginica'],
# [6.4, 3.1, 5.5, 1.8, 'virginica'],
# [6.0, 3.0, 4.8, 1.8, 'virginica'],
# [6.9, 3.1, 5.4, 2.1, 'virginica'],
# [6.7, 3.1, 5.6, 2.4, 'virginica'],
# [6.9, 3.1, 5.1, 2.3, 'virginica'],
# [5.8, 2.7, 5.1, 1.9, 'virginica'],
# [6.8, 3.2, 5.9, 2.3, 'virginica'],
# [6.7, 3.3, 5.7, 2.5, 'virginica'],
# [6.7, 3.0, 5.2, 2.3, 'virginica'],
# [6.3, 2.5, 5.0, 1.9, 'virginica'],
# [6.5, 3.0, 5.2, 2.0, 'virginica'],
# [6.2, 3.4, 5.4, 2.3, 'virginica'],
# [5.9, 3.0, 5.1, 1.8, 'virginica']], dtype=object)
データフレーム→マークダウン
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
データフレーム→マークダウン
print(df.to_markdown())
# | | sepal_length | sepal_width | petal_length | petal_width | species |
# |----:|---------------:|--------------:|---------------:|--------------:|:-----------|
# | 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
# | 1 | 4.9 | 3 | 1.4 | 0.2 | setosa |
# | 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
# | 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
# | 4 | 5 | 3.6 | 1.4 | 0.2 | setosa |
# | 5 | 5.4 | 3.9 | 1.7 | 0.4 | setosa |
# | 6 | 4.6 | 3.4 | 1.4 | 0.3 | setosa |
# | 7 | 5 | 3.4 | 1.5 | 0.2 | setosa |
# | 8 | 4.4 | 2.9 | 1.4 | 0.2 | setosa |
# | 9 | 4.9 | 3.1 | 1.5 | 0.1 | setosa |
# | 10 | 5.4 | 3.7 | 1.5 | 0.2 | setosa |
# | 11 | 4.8 | 3.4 | 1.6 | 0.2 | setosa |
# | 12 | 4.8 | 3 | 1.4 | 0.1 | setosa |
# | 13 | 4.3 | 3 | 1.1 | 0.1 | setosa |
# | 14 | 5.8 | 4 | 1.2 | 0.2 | setosa |
# | 15 | 5.7 | 4.4 | 1.5 | 0.4 | setosa |
# | 16 | 5.4 | 3.9 | 1.3 | 0.4 | setosa |
# | 17 | 5.1 | 3.5 | 1.4 | 0.3 | setosa |
# | 18 | 5.7 | 3.8 | 1.7 | 0.3 | setosa |
# | 19 | 5.1 | 3.8 | 1.5 | 0.3 | setosa |
# | 20 | 5.4 | 3.4 | 1.7 | 0.2 | setosa |
# | 21 | 5.1 | 3.7 | 1.5 | 0.4 | setosa |
# | 22 | 4.6 | 3.6 | 1 | 0.2 | setosa |
# | 23 | 5.1 | 3.3 | 1.7 | 0.5 | setosa |
# | 24 | 4.8 | 3.4 | 1.9 | 0.2 | setosa |
# | 25 | 5 | 3 | 1.6 | 0.2 | setosa |
# | 26 | 5 | 3.4 | 1.6 | 0.4 | setosa |
# | 27 | 5.2 | 3.5 | 1.5 | 0.2 | setosa |
# | 28 | 5.2 | 3.4 | 1.4 | 0.2 | setosa |
# | 29 | 4.7 | 3.2 | 1.6 | 0.2 | setosa |
# | 30 | 4.8 | 3.1 | 1.6 | 0.2 | setosa |
# | 31 | 5.4 | 3.4 | 1.5 | 0.4 | setosa |
# | 32 | 5.2 | 4.1 | 1.5 | 0.1 | setosa |
# | 33 | 5.5 | 4.2 | 1.4 | 0.2 | setosa |
# | 34 | 4.9 | 3.1 | 1.5 | 0.2 | setosa |
# | 35 | 5 | 3.2 | 1.2 | 0.2 | setosa |
# | 36 | 5.5 | 3.5 | 1.3 | 0.2 | setosa |
# | 37 | 4.9 | 3.6 | 1.4 | 0.1 | setosa |
# | 38 | 4.4 | 3 | 1.3 | 0.2 | setosa |
# | 39 | 5.1 | 3.4 | 1.5 | 0.2 | setosa |
# | 40 | 5 | 3.5 | 1.3 | 0.3 | setosa |
# | 41 | 4.5 | 2.3 | 1.3 | 0.3 | setosa |
# | 42 | 4.4 | 3.2 | 1.3 | 0.2 | setosa |
# | 43 | 5 | 3.5 | 1.6 | 0.6 | setosa |
# | 44 | 5.1 | 3.8 | 1.9 | 0.4 | setosa |
# | 45 | 4.8 | 3 | 1.4 | 0.3 | setosa |
# | 46 | 5.1 | 3.8 | 1.6 | 0.2 | setosa |
# | 47 | 4.6 | 3.2 | 1.4 | 0.2 | setosa |
# | 48 | 5.3 | 3.7 | 1.5 | 0.2 | setosa |
# | 49 | 5 | 3.3 | 1.4 | 0.2 | setosa |
# | 50 | 7 | 3.2 | 4.7 | 1.4 | versicolor |
# | 51 | 6.4 | 3.2 | 4.5 | 1.5 | versicolor |
# | 52 | 6.9 | 3.1 | 4.9 | 1.5 | versicolor |
# | 53 | 5.5 | 2.3 | 4 | 1.3 | versicolor |
# | 54 | 6.5 | 2.8 | 4.6 | 1.5 | versicolor |
# | 55 | 5.7 | 2.8 | 4.5 | 1.3 | versicolor |
# | 56 | 6.3 | 3.3 | 4.7 | 1.6 | versicolor |
# | 57 | 4.9 | 2.4 | 3.3 | 1 | versicolor |
# | 58 | 6.6 | 2.9 | 4.6 | 1.3 | versicolor |
# | 59 | 5.2 | 2.7 | 3.9 | 1.4 | versicolor |
# | 60 | 5 | 2 | 3.5 | 1 | versicolor |
# | 61 | 5.9 | 3 | 4.2 | 1.5 | versicolor |
# | 62 | 6 | 2.2 | 4 | 1 | versicolor |
# | 63 | 6.1 | 2.9 | 4.7 | 1.4 | versicolor |
# | 64 | 5.6 | 2.9 | 3.6 | 1.3 | versicolor |
# | 65 | 6.7 | 3.1 | 4.4 | 1.4 | versicolor |
# | 66 | 5.6 | 3 | 4.5 | 1.5 | versicolor |
# | 67 | 5.8 | 2.7 | 4.1 | 1 | versicolor |
# | 68 | 6.2 | 2.2 | 4.5 | 1.5 | versicolor |
# | 69 | 5.6 | 2.5 | 3.9 | 1.1 | versicolor |
# | 70 | 5.9 | 3.2 | 4.8 | 1.8 | versicolor |
# | 71 | 6.1 | 2.8 | 4 | 1.3 | versicolor |
# | 72 | 6.3 | 2.5 | 4.9 | 1.5 | versicolor |
# | 73 | 6.1 | 2.8 | 4.7 | 1.2 | versicolor |
# | 74 | 6.4 | 2.9 | 4.3 | 1.3 | versicolor |
# | 75 | 6.6 | 3 | 4.4 | 1.4 | versicolor |
# | 76 | 6.8 | 2.8 | 4.8 | 1.4 | versicolor |
# | 77 | 6.7 | 3 | 5 | 1.7 | versicolor |
# | 78 | 6 | 2.9 | 4.5 | 1.5 | versicolor |
# | 79 | 5.7 | 2.6 | 3.5 | 1 | versicolor |
# | 80 | 5.5 | 2.4 | 3.8 | 1.1 | versicolor |
# | 81 | 5.5 | 2.4 | 3.7 | 1 | versicolor |
# | 82 | 5.8 | 2.7 | 3.9 | 1.2 | versicolor |
# | 83 | 6 | 2.7 | 5.1 | 1.6 | versicolor |
# | 84 | 5.4 | 3 | 4.5 | 1.5 | versicolor |
# | 85 | 6 | 3.4 | 4.5 | 1.6 | versicolor |
# | 86 | 6.7 | 3.1 | 4.7 | 1.5 | versicolor |
# | 87 | 6.3 | 2.3 | 4.4 | 1.3 | versicolor |
# | 88 | 5.6 | 3 | 4.1 | 1.3 | versicolor |
# | 89 | 5.5 | 2.5 | 4 | 1.3 | versicolor |
# | 90 | 5.5 | 2.6 | 4.4 | 1.2 | versicolor |
# | 91 | 6.1 | 3 | 4.6 | 1.4 | versicolor |
# | 92 | 5.8 | 2.6 | 4 | 1.2 | versicolor |
# | 93 | 5 | 2.3 | 3.3 | 1 | versicolor |
# | 94 | 5.6 | 2.7 | 4.2 | 1.3 | versicolor |
# | 95 | 5.7 | 3 | 4.2 | 1.2 | versicolor |
# | 96 | 5.7 | 2.9 | 4.2 | 1.3 | versicolor |
# | 97 | 6.2 | 2.9 | 4.3 | 1.3 | versicolor |
# | 98 | 5.1 | 2.5 | 3 | 1.1 | versicolor |
# | 99 | 5.7 | 2.8 | 4.1 | 1.3 | versicolor |
# | 100 | 6.3 | 3.3 | 6 | 2.5 | virginica |
# | 101 | 5.8 | 2.7 | 5.1 | 1.9 | virginica |
# | 102 | 7.1 | 3 | 5.9 | 2.1 | virginica |
# | 103 | 6.3 | 2.9 | 5.6 | 1.8 | virginica |
# | 104 | 6.5 | 3 | 5.8 | 2.2 | virginica |
# | 105 | 7.6 | 3 | 6.6 | 2.1 | virginica |
# | 106 | 4.9 | 2.5 | 4.5 | 1.7 | virginica |
# | 107 | 7.3 | 2.9 | 6.3 | 1.8 | virginica |
# | 108 | 6.7 | 2.5 | 5.8 | 1.8 | virginica |
# | 109 | 7.2 | 3.6 | 6.1 | 2.5 | virginica |
# | 110 | 6.5 | 3.2 | 5.1 | 2 | virginica |
# | 111 | 6.4 | 2.7 | 5.3 | 1.9 | virginica |
# | 112 | 6.8 | 3 | 5.5 | 2.1 | virginica |
# | 113 | 5.7 | 2.5 | 5 | 2 | virginica |
# | 114 | 5.8 | 2.8 | 5.1 | 2.4 | virginica |
# | 115 | 6.4 | 3.2 | 5.3 | 2.3 | virginica |
# | 116 | 6.5 | 3 | 5.5 | 1.8 | virginica |
# | 117 | 7.7 | 3.8 | 6.7 | 2.2 | virginica |
# | 118 | 7.7 | 2.6 | 6.9 | 2.3 | virginica |
# | 119 | 6 | 2.2 | 5 | 1.5 | virginica |
# | 120 | 6.9 | 3.2 | 5.7 | 2.3 | virginica |
# | 121 | 5.6 | 2.8 | 4.9 | 2 | virginica |
# | 122 | 7.7 | 2.8 | 6.7 | 2 | virginica |
# | 123 | 6.3 | 2.7 | 4.9 | 1.8 | virginica |
# | 124 | 6.7 | 3.3 | 5.7 | 2.1 | virginica |
# | 125 | 7.2 | 3.2 | 6 | 1.8 | virginica |
# | 126 | 6.2 | 2.8 | 4.8 | 1.8 | virginica |
# | 127 | 6.1 | 3 | 4.9 | 1.8 | virginica |
# | 128 | 6.4 | 2.8 | 5.6 | 2.1 | virginica |
# | 129 | 7.2 | 3 | 5.8 | 1.6 | virginica |
# | 130 | 7.4 | 2.8 | 6.1 | 1.9 | virginica |
# | 131 | 7.9 | 3.8 | 6.4 | 2 | virginica |
# | 132 | 6.4 | 2.8 | 5.6 | 2.2 | virginica |
# | 133 | 6.3 | 2.8 | 5.1 | 1.5 | virginica |
# | 134 | 6.1 | 2.6 | 5.6 | 1.4 | virginica |
# | 135 | 7.7 | 3 | 6.1 | 2.3 | virginica |
# | 136 | 6.3 | 3.4 | 5.6 | 2.4 | virginica |
# | 137 | 6.4 | 3.1 | 5.5 | 1.8 | virginica |
# | 138 | 6 | 3 | 4.8 | 1.8 | virginica |
# | 139 | 6.9 | 3.1 | 5.4 | 2.1 | virginica |
# | 140 | 6.7 | 3.1 | 5.6 | 2.4 | virginica |
# | 141 | 6.9 | 3.1 | 5.1 | 2.3 | virginica |
# | 142 | 5.8 | 2.7 | 5.1 | 1.9 | virginica |
# | 143 | 6.8 | 3.2 | 5.9 | 2.3 | virginica |
# | 144 | 6.7 | 3.3 | 5.7 | 2.5 | virginica |
# | 145 | 6.7 | 3 | 5.2 | 2.3 | virginica |
# | 146 | 6.3 | 2.5 | 5 | 1.9 | virginica |
# | 147 | 6.5 | 3 | 5.2 | 2 | virginica |
# | 148 | 6.2 | 3.4 | 5.4 | 2.3 | virginica |
# | 149 | 5.9 | 3 | 5.1 | 1.8 | virginica |
次元数(行数、列数)を取得
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
次元数(行数、列数)を取得
row, col = df.shape
print(f'行数 : {row}、列数 : {col}')
# 行数 : 150、列数 : 5
各列のデータ型を取得
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
各列のデータ型を取得
print(df.dtypes)
# sepal_length float64
# sepal_width float64
# petal_length float64
# petal_width float64
# species object
# dtype: object
データ配列の要約統計量を取得
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
データ配列の要約統計量を取得
print(df.describe())
# sepal_length sepal_width petal_length petal_width
# count 150.000000 150.000000 150.000000 150.000000
# mean 5.843333 3.057333 3.758000 1.199333
# std 0.828066 0.435866 1.765298 0.762238
# min 4.300000 2.000000 1.000000 0.100000
# 25% 5.100000 2.800000 1.600000 0.300000
# 50% 5.800000 3.000000 4.350000 1.300000
# 75% 6.400000 3.300000 5.100000 1.800000
# max 7.900000 4.400000 6.900000 2.500000
データフレームを転置
サンプルデータ
import pandas as pd
# 1〜10の値が格納された5行3列の2次元配列
df = pd.DataFrame(data=np.random.randint(1, 11, (5, 3)), columns=list('ABC'))
print(df)
# A B C
# 0 5 8 7
# 1 2 3 9
# 2 4 1 9
# 3 2 1 1
# 4 6 2 8
データフレームを転置
print(df.T)
# 0 1 2 3 4
# A 5 2 4 2 6
# B 8 3 1 1 2
# C 7 9 9 1 8
データ配列の全要素に処理を適用
サンプルデータ
import pandas as pd
# 1〜10の値が格納された5行3列の2次元配列
df = pd.DataFrame(data=np.random.randint(1, 11, (5, 3)), columns=list('ABC'))
print(df)
# A B C
# 0 5 8 7
# 1 2 3 9
# 2 4 1 9
# 3 2 1 1
# 4 6 2 8
データ配列の全要素に処理を適用
# 全要素を2乗する
print(df.applymap(lambda x: x**2))
# A B C
# 0 25 64 49
# 1 4 9 81
# 2 16 1 81
# 3 4 1 1
# 4 36 4 64
pandas.Index
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
行のインデックスを取得 | ★★★★★ | df.index | Index |
列のインデックスを取得 | ★★★★★ | df.columns | Index |
列を行のインデックスにセット | ★★★☆☆ | df.set_index('列名') | DataFrame |
行のインデックスを0から振り直す | ★★★★★ | df.reset_index(drop=True) | DataFrame |
行のインデックスを列に追加 | ★★★★☆ | df.reset_index() | DataFrame |
行名を変更 | ★★★★★ | df.rename(index={'変更前の行名': '変更後の行名'}) | DataFrame |
列名を変更 | ★★★★★ | df.rename(columns={'変更前の列名': '変更後の列名'}) | DataFrame |
行、列名を文字列メソッドで一括変更 | ★★★★☆ | df.rename(index=文字列メソッド, columns=文字列メソッド) | DataFrame |
行のインデックスを取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.random.randint(1, 7, (3, 3)),
columns=['col_1', 'col_2', 'col_3'],
index=['row_1', 'row_2', 'row_3'])
print(df)
# col_1 col_2 col_3
# row_1 1 2 2
# row_2 3 1 1
# row_3 5 2 5
行のインデックスを取得
df.index
# Index(['row_1', 'row_2', 'row_3'], dtype='object')
列のインデックスを取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.random.randint(1, 7, (3, 3)),
columns=['col_1', 'col_2', 'col_3'],
index=['row_1', 'row_2', 'row_3'])
print(df)
# col_1 col_2 col_3
# row_1 1 2 2
# row_2 3 1 1
# row_3 5 2 5
列のインデックスを取得
df.columns
# Index(['col_1', 'col_2', 'col_3'], dtype='object')
列を行のインデックスにセット
サンプルデータ
import numpy as np
import pandas as pd
# データフレーム用のデータ配列
d1 = np.array(list('abc'), dtype='object').reshape(3, 1)
d2 = np.random.randint(1, 7, (3, 3))
data = np.hstack([d1, d2])
df = pd.DataFrame(data=data, columns=['type', 'col_1', 'col_2', 'col_3'])
print(df)
# type col_1 col_2 col_3
# 0 a 2 3 4
# 1 b 5 2 5
# 2 c 1 6 2
列を行のインデックスにセット
df.set_index('type')
# col_1 col_2 col_3
# type
# a 2 3 4
# b 5 2 5
# c 1 6 2
行のインデックスを0から振り直す
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.random.randint(1, 7, (3, 3)),
columns=['col_1', 'col_2', 'col_3'],
index=[2, 0, 1])
print(df)
# col_1 col_2 col_3
# 2 2 2 3
# 0 2 4 6
# 1 6 2 1
行のインデックスを列に追加
df.reset_index(drop=True)
# col_1 col_2 col_3
# 0 2 2 3
# 1 2 4 6
# 2 6 2 1
行のインデックスを列に追加
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.random.randint(1, 7, (3, 3)),
columns=['col_1', 'col_2', 'col_3'],
index=['row_1', 'row_2', 'row_3'])
print(df)
# col_1 col_2 col_3
# row_1 5 6 1
# row_2 4 6 4
# row_3 6 5 3
行のインデックスを列に追加
df.reset_index()
# index col_1 col_2 col_3
# 0 row_1 5 6 1
# 1 row_2 4 6 4
# 2 row_3 6 5 3
行名を変更
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.random.randint(1, 7, (3, 3)),
columns=['col_1', 'col_2', 'col_3'],
index=['row_1', 'row_2', 'row_3'])
print(df)
# col_1 col_2 col_3
# row_1 6 3 1
# row_2 2 1 5
# row_3 2 5 4
行名を変更
df.rename(index={'row_1': 'row1', 'row_2': 'row2'})
# col_1 col_2 col_3
# row1 6 3 1
# row2 2 1 5
# row_3 2 5 4
列名を変更
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.random.randint(1, 7, (3, 3)),
columns=['col_1', 'col_2', 'col_3'],
index=['row_1', 'row_2', 'row_3'])
print(df)
# col_1 col_2 col_3
# row_1 6 3 1
# row_2 2 1 5
# row_3 2 5 4
列名を変更
df.rename(columns={'col_1': 'col1', 'col_2': 'col2'})
# col1 col2 col_3
# row_1 6 3 1
# row_2 2 1 5
# row_3 2 5 4
行、列名を文字列メソッドで一括変更
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.random.randint(1, 7, (3, 3)),
columns=['col_1', 'col_2', 'col_3'],
index=['row_1', 'row_2', 'row_3'])
print(df)
# col_1 col_2 col_3
# row_1 6 3 1
# row_2 2 1 5
# row_3 2 5 4
行、列名を文字列メソッドで一括変更
df.rename(index=str.title, columns=str.upper)
# COL_1 COL_2 COL_3
# Row_1 6 3 1
# Row_2 2 1 5
# Row_3 2 5 4
データI/O
CSV
読み込み
逆引き | コマンド |
---|---|
日本語が含まれるファイルを読み込む | pd.read_csv('sample.csv', encoding='cp932') |
Pythonオブジェクト型として読み込む | pd.read_csv('sample.csv', dtype='object') |
ヘッダーを設定して読み込む | pd.read_csv('sample.csv', names=[列名のリスト]) |
インデックスを設定して読み込む | pd.read_csv('sample.csv', index_col='列名') |
先頭から任意の行スキップして読み込む | pd.read_csv('sample.csv', skiprows=行数) |
末尾から任意の行スキップして読み込む | pd.read_csv('sample.csv', skipfooter=行数, engine='python') |
先頭から任意の行だけ読み込む | pd.read_csv('sample.csv', nrows=行数) |
指定した列名だけ読み込む | pd.read_csv('sample.csv', usecols=[列名のリスト]) |
ワイルドカードで読み込む | |
複数のCSVをまとめて1つに読み込む |
ワイルドカードで読み込む
from glob import glob
# csvファイルをワイルドカードで部分一致検索する
df = pd.read_csv(glob('*.csv')[0])
複数のCSVをまとめて1つに読み込む
from glob import glob
# 複数のcsvファイルをワイルドカードで部分一致検索する
csv_files = sorted(glob('*.csv'))
# 複数のCSVファイルを1つのデータフレームに結合する
marge_csv = [pd.read_csv(f) for f in csv_files]
df = pd.concat(marge_csv, ignore_index=True)
書き出し
逆引き | コマンド |
---|---|
インデックスを無視して書き出す | df.to_csv('sample.csv', index=False) |
ヘッダーを無視して書き出す | df.to_csv('sample.csv', header=False) |
文字コードを指定して書き出す | df.to_csv('sample.csv', encoding='UTF-8') |
ダブルクオートして書き出す | |
任意の行数ごとにファイルを分割して書き出す |
ダブルクオートして書き出す
import csv
# ダブルクオートして書き出す
df.to_csv('sample.csv', quoting=csv.QUOTE_ALL)
任意の行数ごとにファイルを分割して書き出す
# データフレームを50行ずつに分割して書き出す
for idx, df2 in df.groupby(by=df.index//50):
df2.to_csv(f'sample_{idx}.csv')
BigQuery
pandasのpandas.read_gbq
メソッドやpandas.DataFrame.to_gbq
メソッドでBigQueryのテーブルを読み込んだり書き込んだりするには、ターミナルでpandas-gbq
モジュールのインストールが必要です。
ターミナル
pip install pandas-gbq
読み込み
テーブルを読み込む
import pandas as pd
# strベースのクエリ
query = 'SELECT * FROM データセット名.テーブル名'
# 標準SQLでテーブルをデータフレームとして格納する
df = pd.read_gbq(query, project_id='プロジェクトID', dialect='standard')
書き出し
テーブルを上書き
import pandas as pd
# テーブルが存在する場合は、それを削除して再作成。
df.to_gbq('データセット名.テーブル名', project_id='プロジェクトID', if_exists='replace')
テーブルに追加
import pandas as pd
# テーブルが存在する場合はデータを挿入。存在しない場合は作成。
df.to_gbq('データセット名.テーブル名', project_id='プロジェクトID', if_exists='append')
pandas.DataFrame.to_gbq
メソッドのtable_schema
パラメータにスキーマが設定されていない場合、データフレームのdtypes
に基づいて生成されます。
注意
BigQueryのテーブルの列名は、全て英語で記号を使う場合は_(アンダーバー)のみとします。データ抽出
直接抽出
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
先頭5行を抽出 | ★★★★★ | df.head() | DataFrame |
末尾5行を抽出 | ★★★★☆ | df.tail() | DataFrame |
行番号で行を抽出 | ★★☆☆☆ | df.iloc[[行番号のリスト], :] | DataFrame |
行番号のスライスで行を抽出 | ★★★☆☆ | df.iloc[行番号のスライス, :] | DataFrame |
行名で行を抽出 | ★★★☆☆ | df.loc[[行名のリスト], :] | DataFrame |
1つの列名で列を抽出 | ★★★★★ | df['列名'] または、df.loc[:, '列名'] | Series |
複数の列名で列を抽出 | ★★★★★ | df[[列名のリスト]] または、df.loc[:, [列名のリスト]] | DataFrame |
先頭5行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
先頭5行を抽出
df.head()
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
末尾5行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
末尾5行を抽出
df.tail()
# sepal_length sepal_width petal_length petal_width species
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
行番号で行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
# シャッフルソート
df = df.sample(frac=1)
print(df)
# sepal_length sepal_width petal_length petal_width species
# 14 5.8 4.0 1.2 0.2 setosa
# 98 5.1 2.5 3.0 1.1 versicolor
# 75 6.6 3.0 4.4 1.4 versicolor
# 16 5.4 3.9 1.3 0.4 setosa
# 131 7.9 3.8 6.4 2.0 virginica
# .. ... ... ... ... ...
# 133 6.3 2.8 5.1 1.5 virginica
# 137 6.4 3.1 5.5 1.8 virginica
# 72 6.3 2.5 4.9 1.5 versicolor
# 140 6.7 3.1 5.6 2.4 virginica
# 37 4.9 3.6 1.4 0.1 setosa
#
# [150 rows x 5 columns]
行番号で行を抽出
df.iloc[[0,1,2,3,4], :]
# sepal_length sepal_width petal_length petal_width species
# 14 5.8 4.0 1.2 0.2 setosa
# 98 5.1 2.5 3.0 1.1 versicolor
# 75 6.6 3.0 4.4 1.4 versicolor
# 16 5.4 3.9 1.3 0.4 setosa
# 131 7.9 3.8 6.4 2.0 virginica
行番号のスライスで行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
# シャッフルソート
df = df.sample(frac=1)
print(df)
# sepal_length sepal_width petal_length petal_width species
# 14 5.8 4.0 1.2 0.2 setosa
# 98 5.1 2.5 3.0 1.1 versicolor
# 75 6.6 3.0 4.4 1.4 versicolor
# 16 5.4 3.9 1.3 0.4 setosa
# 131 7.9 3.8 6.4 2.0 virginica
# .. ... ... ... ... ...
# 133 6.3 2.8 5.1 1.5 virginica
# 137 6.4 3.1 5.5 1.8 virginica
# 72 6.3 2.5 4.9 1.5 versicolor
# 140 6.7 3.1 5.6 2.4 virginica
# 37 4.9 3.6 1.4 0.1 setosa
#
# [150 rows x 5 columns]
行番号のスライスで行を抽出
df.iloc[0:4, :]
# sepal_length sepal_width petal_length petal_width species
# 14 5.8 4.0 1.2 0.2 setosa
# 98 5.1 2.5 3.0 1.1 versicolor
# 75 6.6 3.0 4.4 1.4 versicolor
# 16 5.4 3.9 1.3 0.4 setosa
行名で行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
# シャッフルソート
df = df.sample(frac=1)
print(df)
# sepal_length sepal_width petal_length petal_width species
# 14 5.8 4.0 1.2 0.2 setosa
# 98 5.1 2.5 3.0 1.1 versicolor
# 75 6.6 3.0 4.4 1.4 versicolor
# 16 5.4 3.9 1.3 0.4 setosa
# 131 7.9 3.8 6.4 2.0 virginica
# .. ... ... ... ... ...
# 133 6.3 2.8 5.1 1.5 virginica
# 137 6.4 3.1 5.5 1.8 virginica
# 72 6.3 2.5 4.9 1.5 versicolor
# 140 6.7 3.1 5.6 2.4 virginica
# 37 4.9 3.6 1.4 0.1 setosa
#
# [150 rows x 5 columns]
行名で行を抽出
df.loc[[0,1,2,3,4], :]
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
1つの列名で列を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
1つの列名で列を抽出
df['species']
# 0 setosa
# 1 setosa
# 2 setosa
# 3 setosa
# 4 setosa
# ...
# 145 virginica
# 146 virginica
# 147 virginica
# 148 virginica
# 149 virginica
# Name: species, Length: 150, dtype: object
複数の列名で列を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
複数の列名で列を抽出
df[['sepal_length', 'petal_length']]
# sepal_length petal_length
# 0 5.1 1.4
# 1 4.9 1.4
# 2 4.7 1.3
# 3 4.6 1.5
# 4 5.0 1.4
# .. ... ...
# 145 6.7 5.2
# 146 6.3 5.0
# 147 6.5 5.2
# 148 6.2 5.4
# 149 5.9 5.1
#
# [150 rows x 2 columns]
条件抽出
bool型参照
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
列の要素がスカラーと一致する行を抽出 | ★★★★★ | df[df['列名'] == スカラー] | DataFrame |
列の要素がスカラーと一致しない行を抽出 | ★★★★★ | df[df['列名'] != スカラー] | DataFrame |
列の要素が数値より小さい行を抽出 | ★★★★★ | df[df['列名'] < 数値] | DataFrame |
列の要素が数値以下の行を抽出 | ★★★★★ | df[df['列名'] <= 数値] | DataFrame |
列の要素が数値より大きい行を抽出 | ★★★★★ | df[df['列名'] > 数値] | DataFrame |
列の要素が数値以上の行を抽出 | ★★★★★ | df[df['列名'] >= 数値] | DataFrame |
列の要素が部分一致を満たす行を抽出 | ★★★★★ | df[df['列名'].str.contains('文字列', na=False)] | DataFrame |
列の要素が前方一致を満たす行を抽出 | ★★★★☆ | df[df['列名'].str.startswith('文字列', na=False)] | DataFrame |
列の要素が後方一致を満たす行を抽出 | ★★★★☆ | df[df['列名'].str.endswith('文字列', na=False)] | DataFrame |
列の要素が正規表現を満たす行を抽出 | ★★★★★ | df[df['列名'].str.match(r'正規表現', na=False)] | DataFrame |
論理積(AND) | ★★★★★ | df[(bool値のシリーズ1) & (bool値のシリーズ2)] | DataFrame |
論理和(OR) | ★★★★★ | df[(bool値のシリーズ1) | (bool値のシリーズ2)] | DataFrame |
否定(NOT) | ★★★★★ | df[~(bool値のシリーズ)] | DataFrame |
列の要素がスカラーと一致する行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素がスカラーと一致する行を抽出
df[df['sepal_length']==5.5]
# sepal_length sepal_width petal_length petal_width species
# 33 5.5 4.2 1.4 0.2 setosa
# 36 5.5 3.5 1.3 0.2 setosa
# 53 5.5 2.3 4.0 1.3 versicolor
# 80 5.5 2.4 3.8 1.1 versicolor
# 81 5.5 2.4 3.7 1.0 versicolor
# 89 5.5 2.5 4.0 1.3 versicolor
# 90 5.5 2.6 4.4 1.2 versicolor
列の要素がスカラーと一致しない行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素がスカラーと一致しない行を抽出
df[df['sepal_width']!=3.0]
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# 5 5.4 3.9 1.7 0.4 setosa
# .. ... ... ... ... ...
# 142 5.8 2.7 5.1 1.9 virginica
# 143 6.8 3.2 5.9 2.3 virginica
# 144 6.7 3.3 5.7 2.5 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 148 6.2 3.4 5.4 2.3 virginica
#
# [124 rows x 5 columns]
列の要素が数値より小さい行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素が数値より小さい行を抽出
df[df['petal_length']<1.4]
# sepal_length sepal_width petal_length petal_width species
# 2 4.7 3.2 1.3 0.2 setosa
# 13 4.3 3.0 1.1 0.1 setosa
# 14 5.8 4.0 1.2 0.2 setosa
# 16 5.4 3.9 1.3 0.4 setosa
# 22 4.6 3.6 1.0 0.2 setosa
# 35 5.0 3.2 1.2 0.2 setosa
# 36 5.5 3.5 1.3 0.2 setosa
# 38 4.4 3.0 1.3 0.2 setosa
# 40 5.0 3.5 1.3 0.3 setosa
# 41 4.5 2.3 1.3 0.3 setosa
# 42 4.4 3.2 1.3 0.2 setosa
列の要素が数値以下の行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素が数値以下の行を抽出
df[df['sepal_width']<=2.3]
# sepal_length sepal_width petal_length petal_width species
# 41 4.5 2.3 1.3 0.3 setosa
# 53 5.5 2.3 4.0 1.3 versicolor
# 60 5.0 2.0 3.5 1.0 versicolor
# 62 6.0 2.2 4.0 1.0 versicolor
# 68 6.2 2.2 4.5 1.5 versicolor
# 87 6.3 2.3 4.4 1.3 versicolor
# 93 5.0 2.3 3.3 1.0 versicolor
# 119 6.0 2.2 5.0 1.5 virginica
列の要素が数値より大きい行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素が数値より大きい行を抽出
df[df['sepal_length']>7.0]
# sepal_length sepal_width petal_length petal_width species
# 102 7.1 3.0 5.9 2.1 virginica
# 105 7.6 3.0 6.6 2.1 virginica
# 107 7.3 2.9 6.3 1.8 virginica
# 109 7.2 3.6 6.1 2.5 virginica
# 117 7.7 3.8 6.7 2.2 virginica
# 118 7.7 2.6 6.9 2.3 virginica
# 122 7.7 2.8 6.7 2.0 virginica
# 125 7.2 3.2 6.0 1.8 virginica
# 129 7.2 3.0 5.8 1.6 virginica
# 130 7.4 2.8 6.1 1.9 virginica
# 131 7.9 3.8 6.4 2.0 virginica
# 135 7.7 3.0 6.1 2.3 virginica
列の要素が数値以上の行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素が数値以上の行を抽出
df[df['petal_length']>=6.1]
# sepal_length sepal_width petal_length petal_width species
# 105 7.6 3.0 6.6 2.1 virginica
# 107 7.3 2.9 6.3 1.8 virginica
# 109 7.2 3.6 6.1 2.5 virginica
# 117 7.7 3.8 6.7 2.2 virginica
# 118 7.7 2.6 6.9 2.3 virginica
# 122 7.7 2.8 6.7 2.0 virginica
# 130 7.4 2.8 6.1 1.9 virginica
# 131 7.9 3.8 6.4 2.0 virginica
# 135 7.7 3.0 6.1 2.3 virginica
列の要素が部分一致を満たす行を抽出
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'score': scores})
print(df)
# name score
# 0 Arthur 76
# 1 Allyson 59
# 2 Arnold 51
# 3 Ayden 93
# 4 Alex 32
# 5 Allen 78
# 6 Alberto 55
# 7 Anthony 69
# 8 Amira 88
# 9 Aylin 87
列の要素が部分一致を満たす行を抽出
df[df['name'].str.contains('le', na=False)]
# name score
# 4 Alex 32
# 5 Allen 78
列の要素が前方一致を満たす行を抽出
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'score': scores})
print(df)
# name score
# 0 Arthur 76
# 1 Allyson 59
# 2 Arnold 51
# 3 Ayden 93
# 4 Alex 32
# 5 Allen 78
# 6 Alberto 55
# 7 Anthony 69
# 8 Amira 88
# 9 Aylin 87
列の要素が前方一致を満たす行を抽出
df[df['name'].str.startswith('Ar', na=False)]
# name score
# 0 Arthur 76
# 2 Arnold 51
列の要素が後方一致を満たす行を抽出
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'score': scores})
print(df)
# name score
# 0 Arthur 76
# 1 Allyson 59
# 2 Arnold 51
# 3 Ayden 93
# 4 Alex 32
# 5 Allen 78
# 6 Alberto 55
# 7 Anthony 69
# 8 Amira 88
# 9 Aylin 87
列の要素が後方一致を満たす行を抽出
df[df['name'].str.endswith('en', na=False)]
# name score
# 3 Ayden 93
# 5 Allen 78
列の要素が正規表現を満たす行を抽出
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'score': scores})
print(df)
# name score
# 0 Arthur 76
# 1 Allyson 59
# 2 Arnold 51
# 3 Ayden 93
# 4 Alex 32
# 5 Allen 78
# 6 Alberto 55
# 7 Anthony 69
# 8 Amira 88
# 9 Aylin 87
列の要素が正規表現を満たす行を抽出
df[df['name'].str.match(r'^A.*n$', na=False)]
# name score
# 1 Allyson 59
# 3 Ayden 93
# 5 Allen 78
# 9 Aylin 87
論理積(AND)
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
d = {1: 'A', 2: 'B', 3: 'C'}
groups = [d.get(i) for i in np.random.randint(1, 4, len(names))]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'group': groups, 'score': scores})
print(df)
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 2 Arnold B 52
# 3 Ayden B 51
# 4 Alex B 35
# 5 Allen C 74
# 6 Alberto A 35
# 7 Anthony B 51
# 8 Amira B 62
# 9 Aylin A 52
論理積(AND)
df[(df['group'] == 'B') & (df['score'] >= 52)]
# name group score
# 2 Arnold B 52
# 8 Amira B 62
論理和(OR)
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
d = {1: 'A', 2: 'B', 3: 'C'}
groups = [d.get(i) for i in np.random.randint(1, 4, len(names))]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'group': groups, 'score': scores})
print(df)
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 2 Arnold B 52
# 3 Ayden B 51
# 4 Alex B 35
# 5 Allen C 74
# 6 Alberto A 35
# 7 Anthony B 51
# 8 Amira B 62
# 9 Aylin A 52
論理和(OR)
df[(df['group'] == 'A') | (df['group'] == 'C')]
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 5 Allen C 74
# 6 Alberto A 35
# 9 Aylin A 52
否定(NOT)
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
d = {1: 'A', 2: 'B', 3: 'C'}
groups = [d.get(i) for i in np.random.randint(1, 4, len(names))]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'group': groups, 'score': scores})
print(df)
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 2 Arnold B 52
# 3 Ayden B 51
# 4 Alex B 35
# 5 Allen C 74
# 6 Alberto A 35
# 7 Anthony B 51
# 8 Amira B 62
# 9 Aylin A 52
否定(NOT)
df[~(df['name'].str.startswith('Al', na=False))]
# name group score
# 0 Arthur C 40
# 2 Arnold B 52
# 3 Ayden B 51
# 7 Anthony B 51
# 8 Amira B 62
# 9 Aylin A 52
queryメソッド
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
列の要素がスカラーと一致する行を抽出 | ★★★★★ | df.query('列名 == スカラー') | DataFrame |
列の要素がスカラーと一致しない行を抽出 | ★★★★★ | df.query('列名 != スカラー') | DataFrame |
列の要素が数値より小さい行を抽出 | ★★★★★ | df.query('列名 < 数値') | DataFrame |
列の要素が数値以下の行を抽出 | ★★★★★ | df.query('列名 <= 数値') | DataFrame |
列の要素が数値より大きい行を抽出 | ★★★★★ | df.query('列名 > 数値') | DataFrame |
列の要素が数値以上の行を抽出 | ★★★★★ | df.query('列名 >= 数値') | DataFrame |
論理積(AND) | ★★★★★ | df.query('条件式1 and 条件式2') | DataFrame |
論理和(OR) | ★★★★★ | df.query('条件式1 or 条件式2') | DataFrame |
否定(NOT) | ★★★★★ | df.query('not 条件式') | DataFrame |
クエリ文字列の中で変数を使う | ★★★★★ | df.query('列名 == @変数') | DataFrame |
列の要素がスカラーと一致する行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素がスカラーと一致する行を抽出
df.query('sepal_length == 5.5')
# sepal_length sepal_width petal_length petal_width species
# 33 5.5 4.2 1.4 0.2 setosa
# 36 5.5 3.5 1.3 0.2 setosa
# 53 5.5 2.3 4.0 1.3 versicolor
# 80 5.5 2.4 3.8 1.1 versicolor
# 81 5.5 2.4 3.7 1.0 versicolor
# 89 5.5 2.5 4.0 1.3 versicolor
# 90 5.5 2.6 4.4 1.2 versicolor
列の要素がスカラーと一致しない行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素がスカラーと一致しない行を抽出
df.query('sepal_width != 3.0')
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# 5 5.4 3.9 1.7 0.4 setosa
# .. ... ... ... ... ...
# 142 5.8 2.7 5.1 1.9 virginica
# 143 6.8 3.2 5.9 2.3 virginica
# 144 6.7 3.3 5.7 2.5 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 148 6.2 3.4 5.4 2.3 virginica
#
# [124 rows x 5 columns]
列の要素が数値より小さい行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素が数値より小さい行を抽出
df.query('petal_length < 1.4')
# sepal_length sepal_width petal_length petal_width species
# 2 4.7 3.2 1.3 0.2 setosa
# 13 4.3 3.0 1.1 0.1 setosa
# 14 5.8 4.0 1.2 0.2 setosa
# 16 5.4 3.9 1.3 0.4 setosa
# 22 4.6 3.6 1.0 0.2 setosa
# 35 5.0 3.2 1.2 0.2 setosa
# 36 5.5 3.5 1.3 0.2 setosa
# 38 4.4 3.0 1.3 0.2 setosa
# 40 5.0 3.5 1.3 0.3 setosa
# 41 4.5 2.3 1.3 0.3 setosa
# 42 4.4 3.2 1.3 0.2 setosa
列の要素が数値以下の行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素が数値以下の行を抽出
df.query('sepal_width <= 2.3')
# sepal_length sepal_width petal_length petal_width species
# 41 4.5 2.3 1.3 0.3 setosa
# 53 5.5 2.3 4.0 1.3 versicolor
# 60 5.0 2.0 3.5 1.0 versicolor
# 62 6.0 2.2 4.0 1.0 versicolor
# 68 6.2 2.2 4.5 1.5 versicolor
# 87 6.3 2.3 4.4 1.3 versicolor
# 93 5.0 2.3 3.3 1.0 versicolor
# 119 6.0 2.2 5.0 1.5 virginica
列の要素が数値より大きい行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素が数値より大きい行を抽出
df.query('sepal_length > 7.0')
# sepal_length sepal_width petal_length petal_width species
# 102 7.1 3.0 5.9 2.1 virginica
# 105 7.6 3.0 6.6 2.1 virginica
# 107 7.3 2.9 6.3 1.8 virginica
# 109 7.2 3.6 6.1 2.5 virginica
# 117 7.7 3.8 6.7 2.2 virginica
# 118 7.7 2.6 6.9 2.3 virginica
# 122 7.7 2.8 6.7 2.0 virginica
# 125 7.2 3.2 6.0 1.8 virginica
# 129 7.2 3.0 5.8 1.6 virginica
# 130 7.4 2.8 6.1 1.9 virginica
# 131 7.9 3.8 6.4 2.0 virginica
# 135 7.7 3.0 6.1 2.3 virginica
列の要素が数値以上の行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
列の要素が数値以上の行を抽出
df.query('petal_length >= 6.1')
# sepal_length sepal_width petal_length petal_width species
# 105 7.6 3.0 6.6 2.1 virginica
# 107 7.3 2.9 6.3 1.8 virginica
# 109 7.2 3.6 6.1 2.5 virginica
# 117 7.7 3.8 6.7 2.2 virginica
# 118 7.7 2.6 6.9 2.3 virginica
# 122 7.7 2.8 6.7 2.0 virginica
# 130 7.4 2.8 6.1 1.9 virginica
# 131 7.9 3.8 6.4 2.0 virginica
# 135 7.7 3.0 6.1 2.3 virginica
論理積(AND)
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
d = {1: 'A', 2: 'B', 3: 'C'}
groups = [d.get(i) for i in np.random.randint(1, 4, len(names))]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'group': groups, 'score': scores})
print(df)
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 2 Arnold B 52
# 3 Ayden B 51
# 4 Alex B 35
# 5 Allen C 74
# 6 Alberto A 35
# 7 Anthony B 51
# 8 Amira B 62
# 9 Aylin A 52
論理積(AND)
df.query('group == "B" and score >= 52')
# name group score
# 2 Arnold B 52
# 8 Amira B 62
論理和(OR)
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
d = {1: 'A', 2: 'B', 3: 'C'}
groups = [d.get(i) for i in np.random.randint(1, 4, len(names))]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'group': groups, 'score': scores})
print(df)
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 2 Arnold B 52
# 3 Ayden B 51
# 4 Alex B 35
# 5 Allen C 74
# 6 Alberto A 35
# 7 Anthony B 51
# 8 Amira B 62
# 9 Aylin A 52
論理和(OR)
df.query('group == "A" or group == "C"')
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 5 Allen C 74
# 6 Alberto A 35
# 9 Aylin A 52
否定(NOT)
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
d = {1: 'A', 2: 'B', 3: 'C'}
groups = [d.get(i) for i in np.random.randint(1, 4, len(names))]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'group': groups, 'score': scores})
print(df)
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 2 Arnold B 52
# 3 Ayden B 51
# 4 Alex B 35
# 5 Allen C 74
# 6 Alberto A 35
# 7 Anthony B 51
# 8 Amira B 62
# 9 Aylin A 52
否定(NOT)
df.query('not group == "B"')
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 5 Allen C 74
# 6 Alberto A 35
# 9 Aylin A 52
クエリ文字列の中で変数を使う
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
d = {1: 'A', 2: 'B', 3: 'C'}
groups = [d.get(i) for i in np.random.randint(1, 4, len(names))]
scores = np.random.randint(1, 100, len(names))
df = pd.DataFrame(data={'name': names, 'group': groups, 'score': scores})
print(df)
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 2 Arnold B 52
# 3 Ayden B 51
# 4 Alex B 35
# 5 Allen C 74
# 6 Alberto A 35
# 7 Anthony B 51
# 8 Amira B 62
# 9 Aylin A 52
クエリ文字列の中で変数を使う
g = "B"
df.query('not group == @g')
# name group score
# 0 Arthur C 40
# 1 Allyson A 10
# 5 Allen C 74
# 6 Alberto A 35
# 9 Aylin A 52
注意
列名に.
や半角スペースが含まれていたり、数値だったりするとqueryメソッドは使えません。重複値
抽出
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
要素が全て重複している行を抽出(最初の行を残す) | ★★★★☆ | df[df.duplicated()] | DataFrame |
要素が全て重複している行を抽出(最後の行を残す) | ★★☆☆☆ | df[df.duplicated(keep='last')] | DataFrame |
要素が全て重複している行を抽出(重複行は全て抽出) | ★★☆☆☆ | df[df.duplicated(keep=False)] | DataFrame |
指定した列の要素が重複している行を抽出 | ★★★★★ | df[df.duplicated(subset=[列名のリスト])] | DataFrame |
要素が全て重複している行を抽出(最初の行を残す)
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': list('ABCDEDD'),
'col_2': [20, 20, 12, 53, 44, 53, 53],
'col_3': ['JP', 'JP', 'US', 'UK', 'US', 'UK', 'UK'],
})
print(df)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 E 44 US
# 5 D 53 UK
# 6 D 53 UK
要素が全て重複している行を抽出(最初の行を残す)
df[df.duplicated()]
# col_1 col_2 col_3
# 5 D 53 UK
# 6 D 53 UK
要素が全て重複している行を抽出(最後の行を残す)
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': list('ABCDEDD'),
'col_2': [20, 20, 12, 53, 44, 53, 53],
'col_3': ['JP', 'JP', 'US', 'UK', 'US', 'UK', 'UK'],
})
print(df)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 E 44 US
# 5 D 53 UK
# 6 D 53 UK
要素が全て重複している行を抽出(最後の行を残す)
df[df.duplicated(keep='last')]
# col_1 col_2 col_3
# 3 D 53 UK
# 5 D 53 UK
要素が全て重複している行を抽出
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': list('ABCDEDD'),
'col_2': [20, 20, 12, 53, 44, 53, 53],
'col_3': ['JP', 'JP', 'US', 'UK', 'US', 'UK', 'UK'],
})
print(df)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 E 44 US
# 5 D 53 UK
# 6 D 53 UK
要素が全て重複している行を抽出
df[df.duplicated(keep=False)]
# col_1 col_2 col_3
# 3 D 53 UK
# 5 D 53 UK
# 6 D 53 UK
指定した列の要素が重複している行を抽出
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': list('ABCDEDD'),
'col_2': [20, 20, 12, 53, 44, 53, 53],
'col_3': ['JP', 'JP', 'US', 'UK', 'US', 'UK', 'UK'],
})
print(df)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 E 44 US
# 5 D 53 UK
# 6 D 53 UK
指定した列の要素が重複している行を抽出
df[df.duplicated(subset=['col_2', 'col_3'])]
# col_1 col_2 col_3
# 1 B 20 JP
# 5 D 53 UK
# 6 D 53 UK
削除
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
要素が全て重複している行を削除(最初の行を残す) | ★★★☆☆ | df.drop_duplicates() | DataFrame |
要素が全て重複している行を削除(最後の行を残す) | ★★☆☆☆ | df.drop_duplicates(keep='last') | DataFrame |
要素が全て重複している行を削除(重複行は残さない) | ★★☆☆☆ | df.drop_duplicates(keep=False) | DataFrame |
指定した列の要素が重複している行を削除 | ★★★★★ | df.drop_duplicates(subset=[列名のリスト]) | DataFrame |
要素が全て重複している行を削除(indexを振り直す) | ★★★★☆ | df.drop_duplicates(ignore_index=True) | DataFrame |
要素が全て重複している行を削除(最初の行を残す)
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': list('ABCDDDE'),
'col_2': [20, 20, 12, 53, 53, 53, 44],
'col_3': ['JP', 'JP', 'US', 'UK', 'UK', 'UK', 'US'],
})
print(df)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 D 53 UK
# 5 D 53 UK
# 6 E 44 US
要素が全て重複している行を削除(最後の行を残す)
df.drop_duplicates()
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 6 E 44 US
要素が全て重複している行を削除(最後の行を残す)
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': list('ABCDDDE'),
'col_2': [20, 20, 12, 53, 53, 53, 44],
'col_3': ['JP', 'JP', 'US', 'UK', 'UK', 'UK', 'US'],
})
print(df)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 D 53 UK
# 5 D 53 UK
# 6 E 44 US
要素が全て重複している行を削除(最後の行を残す)
df.drop_duplicates(keep='last')
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 5 D 53 UK
# 6 E 44 US
要素が全て重複している行を削除(重複行は残さない)
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': list('ABCDDDE'),
'col_2': [20, 20, 12, 53, 53, 53, 44],
'col_3': ['JP', 'JP', 'US', 'UK', 'UK', 'UK', 'US'],
})
print(df)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 D 53 UK
# 5 D 53 UK
# 6 E 44 US
要素が全て重複している行を削除(重複行は残さない)
df.drop_duplicates(keep=False)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 6 E 44 US
指定した列の要素が重複している行を削除
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': list('ABCDDDE'),
'col_2': [20, 20, 12, 53, 53, 53, 44],
'col_3': ['JP', 'JP', 'US', 'UK', 'UK', 'UK', 'US'],
})
print(df)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 D 53 UK
# 5 D 53 UK
# 6 E 44 US
指定した列の要素が重複している行を削除
df.drop_duplicates(subset=['col_2', 'col_3'])
# col_1 col_2 col_3
# 0 A 20 JP
# 2 C 12 US
# 3 D 53 UK
# 6 E 44 US
要素が全て重複している行を削除(indexを振り直す)
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': list('ABCDDDE'),
'col_2': [20, 20, 12, 53, 53, 53, 44],
'col_3': ['JP', 'JP', 'US', 'UK', 'UK', 'UK', 'US'],
})
print(df)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 D 53 UK
# 5 D 53 UK
# 6 E 44 US
要素が全て重複している行を削除(indexを振り直す)
df.drop_duplicates(ignore_index=True)
# col_1 col_2 col_3
# 0 A 20 JP
# 1 B 20 JP
# 2 C 12 US
# 3 D 53 UK
# 4 E 44 US
欠損値
抽出
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
各列ごとの欠損値の数を確認 | ★★★★★ | df.isnull().sum() | Series |
欠損値が1つでもある行を抽出 | ★★★★★ | df[df.isnull().any(axis=1)] | DataFrame |
指定した1つの列名に欠損値がある行を抽出 | ★★★★★ | df[df['列名'].isnull()] | DataFrame |
指定した複数の列名に欠損値がある行を抽出 | ★★★★☆ | df[df[[列名のリスト]].isnull().any(axis=1)] | DataFrame |
各列ごとの欠損値の数を確認
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [0, 1, 2, 3, None],
'col_2': [np.nan, 1, 2, 3, None],
'col_3': [0, 1, 2, np.nan, 4],
})
print(df)
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
各列ごとの欠損値の数を確認
df.isnull().sum()
# col_1 1
# col_2 2
# col_3 1
# dtype: int64
欠損値が1つでもある行を抽出
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [0, 1, 2, 3, None],
'col_2': [np.nan, 1, 2, 3, None],
'col_3': [0, 1, 2, np.nan, 4],
})
print(df)
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
欠損値が1つでもある行を抽出
df[df.isnull().any(axis=1)]
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
指定した1つの列名に欠損値がある行を抽出
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [0, 1, 2, 3, None],
'col_2': [np.nan, 1, 2, 3, None],
'col_3': [0, 1, 2, np.nan, 4],
})
print(df)
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
指定した1つの列名に欠損値がある行を抽出
df[df['col_2'].isnull()]
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 4 NaN NaN 4.0
指定した複数の列名に欠損値がある行を抽出
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [0, 1, 2, 3, None],
'col_2': [np.nan, 1, 2, 3, None],
'col_3': [0, 1, 2, np.nan, 4],
})
print(df)
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
指定した複数の列名に欠損値がある行を抽出
df[df[['col_1', 'col_3']].isnull().any(axis=1)]
# col_1 col_2 col_3
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
削除
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
欠損値が1つでもある行を削除 | ★★★★☆ | df.dropna() | DataFrame |
指定した列に欠損値がある行を削除 | ★★★★★ | df.dropna(subset=[列名のリスト]) | DataFrame |
欠損値が1つでもある行を削除
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [0, 1, 2, 3, None],
'col_2': [np.nan, 1, 2, 3, None],
'col_3': [0, 1, 2, np.nan, 4],
})
print(df)
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
欠損値が1つでもある行を削除
df.dropna()
# col_1 col_2 col_3
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
指定した列に欠損値がある行を削除
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [0, 1, 2, 3, None],
'col_2': [np.nan, 1, 2, 3, None],
'col_3': [0, 1, 2, np.nan, 4],
})
print(df)
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
指定した列に欠損値がある行を削除
df.dropna(subset=['col_2'])
# col_1 col_2 col_3
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 NaN
置換
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
すべての欠損値を指定した値で置換 | ★★★★★ | df.fillna('値') | DataFrame |
欠損値を列ごとに指定した値で置換 | ★★★★☆ | df.fillna({'列名': '値'}) | DataFrame |
すべての欠損値を指定した値で置換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [0, 1, 2, 3, None],
'col_2': [np.nan, 1, 2, 3, None],
'col_3': [0, 1, 2, np.nan, 4],
})
print(df)
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
すべての欠損値を指定した値で置換
df.fillna(100)
# col_1 col_2 col_3
# 0 0.0 100.0 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 100.0
# 4 100.0 100.0 4.0
欠損値を列ごとに指定した値で置換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [0, 1, 2, 3, None],
'col_2': [np.nan, 1, 2, 3, None],
'col_3': [0, 1, 2, np.nan, 4],
})
print(df)
# col_1 col_2 col_3
# 0 0.0 NaN 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 NaN
# 4 NaN NaN 4.0
欠損値を列ごとに指定した値で置換
df.fillna({'col_1': 100, 'col_2': 200, 'col_3': 300})
# col_1 col_2 col_3
# 0 0.0 200.0 0.0
# 1 1.0 1.0 1.0
# 2 2.0 2.0 2.0
# 3 3.0 3.0 300.0
# 4 100.0 200.0 4.0
外れ値
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
zスコアで外れ値の検出(データ数が多い場合) | ★★★★★ | ← | DataFrame |
四分位範囲で外れ値の検出(データ数が少ない場合) | ★★★★★ | ← | DataFrame |
zスコアで外れ値の検出(データ数が多い場合)
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam', 'Hudson', 'Alex'
]
# 正常データ、外れ値データを生成
correct_data = np.random.randint(165, 185, len(names) - 2)
outer_data = np.random.random(2)*0.2 + 1.65
join_data = np.hstack([correct_data, outer_data])
# 身長データをシャッフル
heights = np.random.permutation(join_data)
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights})
print(df)
# name height
# 0 Noah 167.000000
# 1 Liam 178.000000
# 2 Elijah 1.790204
# 3 Oliver 176.000000
# 4 James 167.000000
# 5 Mason 171.000000
# 6 Logan 182.000000
# 7 Lucas 177.000000
# 8 Mateo 167.000000
# 9 Ethan 1.723809
# 10 Jacob 181.000000
# 11 Anthony 182.000000
# 12 Joseph 180.000000
# 13 Luke 175.000000
# 14 Isaiah 180.000000
# 15 Nicholas 183.000000
# 16 Aaron 177.000000
# 17 Connor 179.000000
# 18 Jose 178.000000
# 19 Adam 183.000000
# 20 Hudson 174.000000
# 21 Alex 167.000000
前処理
from sklearn import preprocessing as pp
# Zスコア(標本標準偏差)
df['z_score'] = pp.scale(df['height'])
外れ値の検出(慣例では±3の範囲に含まれないもの)
print(df[df['z_score'].apply(abs) >= 3])
# name height z_score
# 2 Elijah 1.790204 -3.144633
# 9 Ethan 1.723809 -3.145950
外れ値を除外したデータフレーム
print(df[df['z_score'].apply(abs) < 3])
# name height z_score
# 0 Noah 167.0 0.132061
# 1 Liam 178.0 0.350230
# 3 Oliver 176.0 0.310562
# 4 James 167.0 0.132061
# 5 Mason 171.0 0.211395
# 6 Logan 182.0 0.429564
# 7 Lucas 177.0 0.330396
# 8 Mateo 167.0 0.132061
# 10 Jacob 181.0 0.409730
# 11 Anthony 182.0 0.429564
# 12 Joseph 180.0 0.389897
# 13 Luke 175.0 0.290729
# 14 Isaiah 180.0 0.389897
# 15 Nicholas 183.0 0.449397
# 16 Aaron 177.0 0.330396
# 17 Connor 179.0 0.370063
# 18 Jose 178.0 0.350230
# 19 Adam 183.0 0.449397
# 20 Hudson 174.0 0.270895
# 21 Alex 167.0 0.132061
四分位範囲で外れ値の検出(データ数が少ない場合)
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam', 'Hudson', 'Alex'
]
# 正常データ、外れ値データを生成
correct_data = np.random.randint(165, 185, len(names) - 2)
outer_data = np.random.random(2)*0.2 + 1.65
join_data = np.hstack([correct_data, outer_data])
# 身長データをシャッフル
heights = np.random.permutation(join_data)
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights})
print(df)
# name height
# 0 Noah 180.000000
# 1 Liam 166.000000
# 2 Elijah 170.000000
# 3 Oliver 180.000000
# 4 James 182.000000
# 5 Mason 172.000000
# 6 Logan 165.000000
# 7 Lucas 170.000000
# 8 Mateo 169.000000
# 9 Ethan 184.000000
# 10 Jacob 1.799861
# 11 Anthony 183.000000
# 12 Joseph 170.000000
# 13 Luke 184.000000
# 14 Isaiah 1.689017
# 15 Nicholas 172.000000
# 16 Aaron 179.000000
# 17 Connor 182.000000
# 18 Jose 173.000000
# 19 Adam 172.000000
# 20 Hudson 170.000000
# 21 Alex 183.000000
四分位範囲で外れ値の検出(データ数が少ない場合)
# 第1四分位数
q1 = df['height'].quantile(0.25)
# 第3四分位数
q3 = df['height'].quantile(0.75)
# 四分位範囲
iqr = q3 - q1
# 下方、上方の境界点を算出
bottom, up = (q1 - (1.5 * iqr), q3 + (1.5 * iqr))
# 外れ値の検出
df[(df['height'] < bottom) & (df['height'] > up)]
# name height
# 10 Jacob 1.799861
# 14 Isaiah 1.689017
サンプリング
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
ランダムに1行を抽出 | ★★☆☆☆ | df.sample() | DataFrame |
ランダムに30行を抽出 | ★★★★☆ | df.sample(n=30, replace=False, random_state=None) | DataFrame |
ランダムに30%行を抽出 | ★★★☆☆ | df.sample(frac=0.3, replace=False, random_state=None) | DataFrame |
ランダムに1行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
ランダムに1行を抽出
df.sample()
# sepal_length sepal_width petal_length petal_width species
# 65 6.7 3.1 4.4 1.4 versicolor
ランダムに30行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
ランダムに30行を抽出
df.sample(n=30, replace=False, random_state=None)
# sepal_length sepal_width petal_length petal_width species
# 38 4.4 3.0 1.3 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 88 5.6 3.0 4.1 1.3 versicolor
# 32 5.2 4.1 1.5 0.1 setosa
# 109 7.2 3.6 6.1 2.5 virginica
# 101 5.8 2.7 5.1 1.9 virginica
# 82 5.8 2.7 3.9 1.2 versicolor
# 110 6.5 3.2 5.1 2.0 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 44 5.1 3.8 1.9 0.4 setosa
# 15 5.7 4.4 1.5 0.4 setosa
# 68 6.2 2.2 4.5 1.5 versicolor
# 149 5.9 3.0 5.1 1.8 virginica
# 17 5.1 3.5 1.4 0.3 setosa
# 87 6.3 2.3 4.4 1.3 versicolor
# 94 5.6 2.7 4.2 1.3 versicolor
# 33 5.5 4.2 1.4 0.2 setosa
# 98 5.1 2.5 3.0 1.1 versicolor
# 128 6.4 2.8 5.6 2.1 virginica
# 132 6.4 2.8 5.6 2.2 virginica
# 127 6.1 3.0 4.9 1.8 virginica
# 126 6.2 2.8 4.8 1.8 virginica
# 116 6.5 3.0 5.5 1.8 virginica
# 18 5.7 3.8 1.7 0.3 setosa
# 61 5.9 3.0 4.2 1.5 versicolor
# 140 6.7 3.1 5.6 2.4 virginica
# 57 4.9 2.4 3.3 1.0 versicolor
# 27 5.2 3.5 1.5 0.2 setosa
# 67 5.8 2.7 4.1 1.0 versicolor
# 143 6.8 3.2 5.9 2.3 virginica
ランダムに30%行を抽出
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
ランダムに30%行を抽出
df.sample(frac=0.3, replace=False, random_state=None)
# sepal_length sepal_width petal_length petal_width species
# 33 5.5 4.2 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 87 6.3 2.3 4.4 1.3 versicolor
# 52 6.9 3.1 4.9 1.5 versicolor
# 95 5.7 3.0 4.2 1.2 versicolor
# 136 6.3 3.4 5.6 2.4 virginica
# 39 5.1 3.4 1.5 0.2 setosa
# 44 5.1 3.8 1.9 0.4 setosa
# 141 6.9 3.1 5.1 2.3 virginica
# 18 5.7 3.8 1.7 0.3 setosa
# 140 6.7 3.1 5.6 2.4 virginica
# 70 5.9 3.2 4.8 1.8 versicolor
# 9 4.9 3.1 1.5 0.1 setosa
# 91 6.1 3.0 4.6 1.4 versicolor
# 68 6.2 2.2 4.5 1.5 versicolor
# 49 5.0 3.3 1.4 0.2 setosa
# 27 5.2 3.5 1.5 0.2 setosa
# 21 5.1 3.7 1.5 0.4 setosa
# 60 5.0 2.0 3.5 1.0 versicolor
# 12 4.8 3.0 1.4 0.1 setosa
# 51 6.4 3.2 4.5 1.5 versicolor
# 61 5.9 3.0 4.2 1.5 versicolor
# 65 6.7 3.1 4.4 1.4 versicolor
# 94 5.6 2.7 4.2 1.3 versicolor
# 114 5.8 2.8 5.1 2.4 virginica
# 86 6.7 3.1 4.7 1.5 versicolor
# 100 6.3 3.3 6.0 2.5 virginica
# 24 4.8 3.4 1.9 0.2 setosa
# 14 5.8 4.0 1.2 0.2 setosa
# 133 6.3 2.8 5.1 1.5 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 59 5.2 2.7 3.9 1.4 versicolor
# 36 5.5 3.5 1.3 0.2 setosa
# 79 5.7 2.6 3.5 1.0 versicolor
# 5 5.4 3.9 1.7 0.4 setosa
# 132 6.4 2.8 5.6 2.2 virginica
# 97 6.2 2.9 4.3 1.3 versicolor
# 28 5.2 3.4 1.4 0.2 setosa
# 111 6.4 2.7 5.3 1.9 virginica
# 58 6.6 2.9 4.6 1.3 versicolor
# 144 6.7 3.3 5.7 2.5 virginica
# 25 5.0 3.0 1.6 0.2 setosa
# 96 5.7 2.9 4.2 1.3 versicolor
# 120 6.9 3.2 5.7 2.3 virginica
# 47 4.6 3.2 1.4 0.2 setosa
データ変形
行、列の追加
行、列の削除
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
指定した行を削除 | ★★★★☆ | df.drop(index=[行名リスト]) | DataFrame |
指定した列を削除 | ★★★★★ | df.drop(columns=[列名のリスト]) | DataFrame |
指定した行を削除
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
# 名前の文字数
name_cnts = [len(i) for i in names]
# 血液型
d = {1: 'A', 2: 'B', 3: 'O', 4: 'AB'}
bloods = [d.get(i) for i in np.random.randint(1, 5, len(names))]
# 点数
scores = np.random.randint(1, 100, len(names))
# データフレームを作成
df = pd.DataFrame(data={
'name': names,
'name_cnt': name_cnts,
'blood': bloods,
'score': scores
})
print(df)
# name name_cnt blood score
# 0 Arthur 6 O 87
# 1 Allyson 7 O 57
# 2 Arnold 6 A 99
# 3 Ayden 5 B 78
# 4 Alex 4 B 98
# 5 Allen 5 A 92
# 6 Alberto 7 B 96
# 7 Anthony 7 AB 50
# 8 Amira 5 B 50
# 9 Aylin 5 A 37
指定した行を削除
df.drop(index=[0, 1, 8, 9])
# name name_cnt blood score
# 2 Arnold 6 A 99
# 3 Ayden 5 B 78
# 4 Alex 4 B 98
# 5 Allen 5 A 92
# 6 Alberto 7 B 96
# 7 Anthony 7 AB 50
指定した列を削除
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
# 名前の文字数
name_cnts = [len(i) for i in names]
# 血液型
d = {1: 'A', 2: 'B', 3: 'O', 4: 'AB'}
bloods = [d.get(i) for i in np.random.randint(1, 5, len(names))]
# 点数
scores = np.random.randint(1, 100, len(names))
# データフレームを作成
df = pd.DataFrame(data={
'name': names,
'name_cnt': name_cnts,
'blood': bloods,
'score': scores
})
print(df)
# name name_cnt blood score
# 0 Arthur 6 O 87
# 1 Allyson 7 O 57
# 2 Arnold 6 A 99
# 3 Ayden 5 B 78
# 4 Alex 4 B 98
# 5 Allen 5 A 92
# 6 Alberto 7 B 96
# 7 Anthony 7 AB 50
# 8 Amira 5 B 50
# 9 Aylin 5 A 37
指定した列を削除
df.drop(columns=['name_cnt', 'score'])
# name blood
# 0 Arthur O
# 1 Allyson O
# 2 Arnold A
# 3 Ayden B
# 4 Alex B
# 5 Allen A
# 6 Alberto B
# 7 Anthony AB
# 8 Amira B
# 9 Aylin A
並び替え
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
行のインデックスで昇順ソート | ★★★★★ | df.sort_index() | DataFrame |
行のインデックスで降順ソート | ★★★★★ | df.sort_index(ascending=False) | DataFrame |
列の要素で昇順ソート | ★★★★☆ | df.sort_values(by='列名') | DataFrame |
列の要素で降順ソート | ★★★★☆ | df.sort_values(by='列名', ascending=False) | DataFrame |
複数の列の要素でソート | ★★★★★ | df.sort_values(by=[列名のリスト], ascending=[boolリスト]) | DataFrame |
列の要素を辞書ソート | ★★★★★ | ← | DataFrame |
シャッフルソート | ★★★★☆ | df.sample(frac=1) | DataFrame |
行のインデックスで昇順ソート
サンプルデータ
import pandas as pd
df = pd.DataFrame(
{
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
},
index=[2, 1, 5, 3, 4])
print(df)
# col_1 col_2
# 2 apple 200
# 1 banana 100
# 5 apple 250
# 3 cherry 400
# 4 banana 300
行のインデックスで昇順ソート
df.sort_index()
# col_1 col_2
# 1 banana 100
# 2 apple 200
# 3 cherry 400
# 4 banana 300
# 5 apple 250
行のインデックスで降順ソート
サンプルデータ
import pandas as pd
df = pd.DataFrame(
{
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
},
index=[2, 1, 5, 3, 4])
print(df)
# col_1 col_2
# 2 apple 200
# 1 banana 100
# 5 apple 250
# 3 cherry 400
# 4 banana 300
行のインデックスで降順ソート
df.sort_index(ascending=False)
# col_1 col_2
# 5 apple 250
# 4 banana 300
# 3 cherry 400
# 2 apple 200
# 1 banana 100
列の要素で昇順ソート
サンプルデータ
import pandas as pd
df = pd.DataFrame(
{
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
},
index=[2, 1, 5, 3, 4])
print(df)
# col_1 col_2
# 2 apple 200
# 1 banana 100
# 5 apple 250
# 3 cherry 400
# 4 banana 300
列の要素で昇順ソート
df.sort_values(by='col_2')
# col_1 col_2
# 1 banana 100
# 2 apple 200
# 5 apple 250
# 4 banana 300
# 3 cherry 400
列の要素で降順ソート
サンプルデータ
import pandas as pd
df = pd.DataFrame(
{
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
},
index=[2, 1, 5, 3, 4])
print(df)
# col_1 col_2
# 2 apple 200
# 1 banana 100
# 5 apple 250
# 3 cherry 400
# 4 banana 300
列の要素で降順ソート
df.sort_values(by='col_2', ascending=False)
# col_1 col_2
# 3 cherry 400
# 4 banana 300
# 5 apple 250
# 2 apple 200
# 1 banana 100
複数の列の要素でソート
サンプルデータ
import pandas as pd
df = pd.DataFrame(
{
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
},
index=[2, 1, 5, 3, 4])
print(df)
# col_1 col_2
# 2 apple 200
# 1 banana 100
# 5 apple 250
# 3 cherry 400
# 4 banana 300
複数の列の要素でソート
df.sort_values(by=['col_1', 'col_2'], ascending=[True, False])
# col_1 col_2
# 5 apple 250
# 2 apple 200
# 4 banana 300
# 1 banana 100
# 3 cherry 400
列の要素を辞書ソート
サンプルデータ
import pandas as pd
df = pd.DataFrame(
{
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
},
index=[2, 1, 5, 3, 4])
print(df)
# col_1 col_2
# 2 apple 200
# 1 banana 100
# 5 apple 250
# 3 cherry 400
# 4 banana 300
列の要素を辞書ソート
d = {'cherry': 1, 'apple': 2, 'banana': 3}
df['order'] = df['col1'].map(d)
df.sort_values(by=['order', 'col_2'], ascending=[True, False]).drop(columns=['order'])
# col_1 col_2
# 3 cherry 400
# 5 apple 250
# 2 apple 200
# 4 banana 300
# 1 banana 100
シャッフルソート
サンプルデータ
import pandas as pd
df = pd.DataFrame(
{
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
},
index=[2, 1, 5, 3, 4])
print(df)
# col_1 col_2
# 2 apple 200
# 1 banana 100
# 5 apple 250
# 3 cherry 400
# 4 banana 300
シャッフルソート
df.sample(frac=1)
# col_1 col_2
# 2 apple 200
# 3 cherry 400
# 5 apple 250
# 1 banana 100
# 4 banana 300
結合
ユニオン(縦方向の結合)
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
ユニオン(縦方向の結合) | ★★★★★ | pd.concat([df1, df2], ignore_index=True) | DataFrame |
ユニオン(縦方向の結合)
サンプルデータ
import pandas as pd
df1 = pd.DataFrame(data={
'a': ['a_1', 'a_2', 'a_3'],
'b': ['b_1', 'b_2', 'b_3'],
})
print(df1)
# a b
# 0 a_1 b_1
# 1 a_2 b_2
# 2 a_3 b_3
df2 = pd.DataFrame(data={
'a': ['a_4', 'a_5', 'a_6'],
'b': ['b_4', 'b_5', 'b_6'],
})
print(df2)
# a b
# 0 a_4 b_4
# 1 a_5 b_5
# 2 a_6 b_6
ユニオン(縦方向の結合)
pd.concat([df1, df2], ignore_index=True)
# a b
# 0 a_1 b_1
# 1 a_2 b_2
# 2 a_3 b_3
# 3 a_4 b_4
# 4 a_5 b_5
# 5 a_6 b_6
ジョイン(横方向の結合)
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
レフトジョイン(横方向の左結合) | ★★★★★ | pd.merge(df1, df2, on=[列名のリスト], how='left') | DataFrame |
インナージョイン(横方向の内部結合) | ★★★☆☆ | pd.merge(df1, df2, on=[列名のリスト], how='inner') | DataFrame |
アウタージョイン(横方向の外部結合) | ★★★★☆ | pd.merge(df1, df2, on=[列名のリスト], how='outer') | DataFrame |
レフトジョイン(横方向の左結合)
サンプルデータ
import pandas as pd
df1 = pd.DataFrame(data={
'a': ['a_1', 'a_2', 'a_3'],
'b': ['b_1', 'b_2', 'b_3'],
})
print(df1)
# a b
# 0 a_1 b_1
# 1 a_2 b_2
# 2 a_3 b_3
df2 = pd.DataFrame(data={
'a': ['a_1', 'a_2', 'a_4'],
'c': ['c_1', 'c_2', 'c_4'],
})
print(df2)
# a c
# 0 a_1 c_1
# 1 a_2 c_2
# 2 a_4 c_4
レフトジョイン(横方向の左結合)
pd.merge(left=df1, right=df2, on=['a'], how='left')
# a b c
# 0 a_1 b_1 c_1
# 1 a_2 b_2 c_2
# 2 a_3 b_3 NaN
インナージョイン(横方向の内部結合)
サンプルデータ
import pandas as pd
df1 = pd.DataFrame(data={
'a': ['a_1', 'a_2', 'a_3'],
'b': ['b_1', 'b_2', 'b_3'],
})
print(df1)
# a b
# 0 a_1 b_1
# 1 a_2 b_2
# 2 a_3 b_3
df2 = pd.DataFrame(data={
'a': ['a_1', 'a_2', 'a_4'],
'c': ['c_1', 'c_2', 'c_4'],
})
print(df2)
# a c
# 0 a_1 c_1
# 1 a_2 c_2
# 2 a_4 c_4
インナージョイン(横方向の内部結合)
pd.merge(left=df1, right=df2, on=['a'], how='inner')
# a b c
# 0 a_1 b_1 c_1
# 1 a_2 b_2 c_2
アウタージョイン(横方向の外部結合)
サンプルデータ
import pandas as pd
df1 = pd.DataFrame(data={
'a': ['a_1', 'a_2', 'a_3'],
'b': ['b_1', 'b_2', 'b_3'],
})
print(df1)
# a b
# 0 a_1 b_1
# 1 a_2 b_2
# 2 a_3 b_3
df2 = pd.DataFrame(data={
'a': ['a_1', 'a_2', 'a_4'],
'c': ['c_1', 'c_2', 'c_4'],
})
print(df2)
# a c
# 0 a_1 c_1
# 1 a_2 c_2
# 2 a_4 c_4
アウタージョイン(横方向の外部結合)
pd.merge(left=df1, right=df2, on=['a'], how='outer')
# a b c
# 0 a_1 b_1 c_1
# 1 a_2 b_2 c_2
# 2 a_3 b_3 NaN
# 3 a_4 NaN c_4
縦横変換
分割
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
ホールドアウトセット | ★★★★☆ | ← | DataFrame |
ホールドアウトセット
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
ホールドアウトセット
from sklearn.model_selection import train_test_split
Xdf = df.drop(columns='species') # 特徴量
ydf = df['species'] # 目的変数
Xtrain, Xtest, ytrain, ytest = train_test_split(Xdf, ydf, test_size=0.3, random_state=1)
print(Xtrain)
# sepal_length sepal_width petal_length petal_width
# 118 7.7 2.6 6.9 2.3
# 18 5.7 3.8 1.7 0.3
# 4 5.0 3.6 1.4 0.2
# 45 4.8 3.0 1.4 0.3
# 59 5.2 2.7 3.9 1.4
# .. ... ... ... ...
# 133 6.3 2.8 5.1 1.5
# 137 6.4 3.1 5.5 1.8
# 72 6.3 2.5 4.9 1.5
# 140 6.7 3.1 5.6 2.4
# 37 4.9 3.6 1.4 0.1
#
# [105 rows x 4 columns]
print(Xtest)
# sepal_length sepal_width petal_length petal_width
# 14 5.8 4.0 1.2 0.2
# 98 5.1 2.5 3.0 1.1
# 75 6.6 3.0 4.4 1.4
# 16 5.4 3.9 1.3 0.4
# 131 7.9 3.8 6.4 2.0
# .. ... ... ... ...
# 112 6.8 3.0 5.5 2.1
# 17 5.1 3.5 1.4 0.3
# 119 6.0 2.2 5.0 1.5
# 103 6.3 2.9 5.6 1.8
# 58 6.6 2.9 4.6 1.3
#
# [45 rows x 4 columns]
print(ytrain)
# 118 virginica
# 18 setosa
# 4 setosa
# 45 setosa
# 59 versicolor
# ...
# 133 virginica
# 137 virginica
# 72 versicolor
# 140 virginica
# 37 setosa
# Name: species, Length: 105, dtype: object
print(ytest)
# 14 setosa
# 98 versicolor
# 75 versicolor
# 16 setosa
# 131 virginica
# ...
# 112 virginica
# 17 setosa
# 119 virginica
# 103 virginica
# 58 versicolor
# Name: species, Length: 45, dtype: object
不均衡データの調整
目的変数のデータの比率に偏りがあるものを不均衡データと言います。偏りがあるままモデリングするといろいろ不都合があるので、通常は以下の方法のいずれかを使用しデータを揃えます。
不均衡データの調整方法
- アンダーサンプリング:多いデータを減らす
- オーバーサンプリング:少ないデータを増やす
データが不均衡データであるか否かは、pandas.Series
クラスのvalue_counts
メソッドで簡単に確認することができます。
データが不均衡であるか確認する
print(df)
# height weight target
# 0 175.9 70.2 0
# 1 167.2 58.1 0
# 2 172.0 63.5 0
# 3 182.1 78.3 0
# 4 162.3 52.3 0
# 5 170.4 64.2 0
# 6 169.3 59.1 0
# 7 170.5 70.2 0
# 8 176.2 72.9 0
# 9 172.1 67.9 0
# 10 155.2 45.3 1
# 11 162.1 50.1 1
# 12 157.0 48.2 1
# 13 156.0 62.2 1
# 14 152.0 57.2 1
print(df['target'].value_counts())
# 0 10
# 1 5
# Name: target, dtype: int64
アンダーサンプリング
逆引き | コマンド | 戻り値 |
---|---|---|
アンダーサンプリングで不均衡データを調整 | ← | DataFrame , Series |
アンダーサンプリングで不均衡データを調整
サンプルデータ
import pandas as pd
data = [
[175.9, 70.2, 0],
[167.2, 58.1, 0],
[172.0, 63.5, 0],
[182.1, 78.3, 0],
[162.3, 52.3, 0],
[170.4, 64.2, 0],
[169.3, 59.1, 0],
[170.5, 70.2, 0],
[176.2, 72.9, 0],
[172.1, 67.9, 0],
[155.2, 45.3, 1],
[162.1, 50.1, 1],
[157.0, 48.2, 1],
[156.0, 62.2, 1],
[152.0, 57.2, 1],
]
# データフレームを作成
df = pd.DataFrame(data=data, columns=['height', 'weight', 'target'])
print(df)
# height weight target
# 0 175.9 70.2 0
# 1 167.2 58.1 0
# 2 172.0 63.5 0
# 3 182.1 78.3 0
# 4 162.3 52.3 0
# 5 170.4 64.2 0
# 6 169.3 59.1 0
# 7 170.5 70.2 0
# 8 176.2 72.9 0
# 9 172.1 67.9 0
# 10 155.2 45.3 1
# 11 162.1 50.1 1
# 12 157.0 48.2 1
# 13 156.0 62.2 1
# 14 152.0 57.2 1
アンダーサンプリングで不均衡データを調整
from imblearn.under_sampling import RandomUnderSampler
rs = RandomUnderSampler(random_state=0)
df_sample, _ = rs.fit_sample(df, df['target'])
print(df_sample)
# height weight target
# 0 172.0 63.5 0
# 1 176.2 72.9 0
# 2 162.3 52.3 0
# 3 172.1 67.9 0
# 4 167.2 58.1 0
# 5 155.2 45.3 1
# 6 162.1 50.1 1
# 7 157.0 48.2 1
# 8 156.0 62.2 1
# 9 152.0 57.2 1
オーバーサンプリング
逆引き | コマンド | 戻り値 |
---|---|---|
オーバーサンプリングで不均衡データを調整 | ← | DataFrame , Series |
オーバーサンプリングで不均衡データを調整
サンプルデータ
import pandas as pd
data = [
[175.9, 70.2, 0],
[167.2, 58.1, 0],
[172.0, 63.5, 0],
[182.1, 78.3, 0],
[162.3, 52.3, 0],
[170.4, 64.2, 0],
[169.3, 59.1, 0],
[170.5, 70.2, 0],
[176.2, 72.9, 0],
[172.1, 67.9, 0],
[155.2, 45.3, 1],
[162.1, 50.1, 1],
[157.0, 48.2, 1],
[156.0, 62.2, 1],
[152.0, 57.2, 1],
]
# データフレームを作成
df = pd.DataFrame(data=data, columns=['height', 'weight', 'target'])
print(df)
# height weight target
# 0 175.9 70.2 0
# 1 167.2 58.1 0
# 2 172.0 63.5 0
# 3 182.1 78.3 0
# 4 162.3 52.3 0
# 5 170.4 64.2 0
# 6 169.3 59.1 0
# 7 170.5 70.2 0
# 8 176.2 72.9 0
# 9 172.1 67.9 0
# 10 155.2 45.3 1
# 11 162.1 50.1 1
# 12 157.0 48.2 1
# 13 156.0 62.2 1
# 14 152.0 57.2 1
オーバーサンプリングで不均衡データを調整
from imblearn.over_sampling import SMOTE
sm = SMOTE(sampling_strategy='auto', k_neighbors=3, random_state=0)
df_sample, _ = sm.fit_sample(df, df['target'])
print(df_sample)
# height weight target
# 0 175.900000 70.200000 0
# 1 167.200000 58.100000 0
# 2 172.000000 63.500000 0
# 3 182.100000 78.300000 0
# 4 162.300000 52.300000 0
# 5 170.400000 64.200000 0
# 6 169.300000 59.100000 0
# 7 170.500000 70.200000 0
# 8 176.200000 72.900000 0
# 9 172.100000 67.900000 0
# 10 155.200000 45.300000 1
# 11 162.100000 50.100000 1
# 12 157.000000 48.200000 1
# 13 156.000000 62.200000 1
# 14 152.000000 57.200000 1
# 15 154.179533 59.924416 1
# 16 157.821087 53.107949 1
# 17 156.362609 47.173093 1
# 18 159.868305 49.268584 1
# 19 156.891773 49.715178 1
データ変換
型変換
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
整数型に型変換 | ★★★★★ | df['列名'].astype('int') | Series |
浮動小数点型に型変換 | ★★★☆☆ | df['列名'].astype('float') | Series |
文字列型に型変換 | ★★★★★ | df['列名'].astype('str') | Series |
ブール型に型変換 | ★★★☆☆ | df['列名'].astype('bool') | Series |
オブジェクト型に型変換 | ★★★☆☆ | df['列名'].astype('object') | Series |
複数の列を型変換 | ★★★★★ | df.astype({'列名': 'データ型'}) | DataFrame |
全ての列を型変換 | ★★★☆☆ | df.astype('データ型') | DataFrame |
整数型に型変換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [1, 4, 9, 16, 25],
'col_2': [2.4, 5.1, 10.3, 17.9, 26.0],
'col_3': [0, 1, np.nan, 2, None],
'col_4': [True, True, False, False, True],
})
print(df)
# col_1 col_2 col_3 col_4
# 0 1 2.4 0.0 True
# 1 4 5.1 1.0 True
# 2 9 10.3 NaN False
# 3 16 17.9 2.0 False
# 4 25 26.0 NaN True
print(df.dtypes)
# col_1 int64
# col_2 float64
# col_3 float64
# col_4 bool
# dtype: object
整数型に型変換
# 整数型に型変換(小数点を切り捨てる。boolはTrueを1、Falseを0に変換。欠損値があるとエラー)
df['col_2'].astype('int')
# 0 2
# 1 5
# 2 10
# 3 17
# 4 26
# Name: col_2, dtype: int64
浮動小数点型に型変換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [1, 4, 9, 16, 25],
'col_2': [2.4, 5.1, 10.3, 17.9, 26.0],
'col_3': [0, 1, np.nan, 2, None],
'col_4': [True, True, False, False, True],
})
print(df)
# col_1 col_2 col_3 col_4
# 0 1 2.4 0.0 True
# 1 4 5.1 1.0 True
# 2 9 10.3 NaN False
# 3 16 17.9 2.0 False
# 4 25 26.0 NaN True
print(df.dtypes)
# col_1 int64
# col_2 float64
# col_3 float64
# col_4 bool
# dtype: object
浮動小数点型に型変換
df['col_1'].astype('float')
# 0 1.0
# 1 4.0
# 2 9.0
# 3 16.0
# 4 25.0
# Name: col_1, dtype: float64
文字列型に型変換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [1, 4, 9, 16, 25],
'col_2': [2.4, 5.1, 10.3, 17.9, 26.0],
'col_3': [0, 1, np.nan, 2, None],
'col_4': [True, True, False, False, True],
})
print(df)
# col_1 col_2 col_3 col_4
# 0 1 2.4 0.0 True
# 1 4 5.1 1.0 True
# 2 9 10.3 NaN False
# 3 16 17.9 2.0 False
# 4 25 26.0 NaN True
print(df.dtypes)
# col_1 int64
# col_2 float64
# col_3 float64
# col_4 bool
# dtype: object
文字列型に型変換
# 文字列型に型変換(欠損値はNaN、NaT文字列として認識される)
df['col_3'].astype('str')
# 0 0.0
# 1 1.0
# 2 nan
# 3 2.0
# 4 nan
# Name: col_3, dtype: object
ブール型に型変換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [1, 4, 9, 16, 25],
'col_2': [2.4, 5.1, 10.3, 17.9, 26.0],
'col_3': [0, 1, np.nan, 2, None],
'col_4': [True, True, False, False, True],
})
print(df)
# col_1 col_2 col_3 col_4
# 0 1 2.4 0.0 True
# 1 4 5.1 1.0 True
# 2 9 10.3 NaN False
# 3 16 17.9 2.0 False
# 4 25 26.0 NaN True
print(df.dtypes)
# col_1 int64
# col_2 float64
# col_3 float64
# col_4 bool
# dtype: object
ブール型に型変換
# bool型に型変換(0以外をTrue、0をFalseに変換する。※欠損値はTrue)
df['col_3'].astype('bool')
# 0 False
# 1 True
# 2 True
# 3 True
# 4 True
# Name: col_3, dtype: bool
オブジェクト型に型変換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [1, 4, 9, 16, 25],
'col_2': [2.4, 5.1, 10.3, 17.9, 26.0],
'col_3': [0, 1, np.nan, 2, None],
'col_4': [True, True, False, False, True],
})
print(df)
# col_1 col_2 col_3 col_4
# 0 1 2.4 0.0 True
# 1 4 5.1 1.0 True
# 2 9 10.3 NaN False
# 3 16 17.9 2.0 False
# 4 25 26.0 NaN True
print(df.dtypes)
# col_1 int64
# col_2 float64
# col_3 float64
# col_4 bool
# dtype: object
オブジェクト型に型変換
df['col_3'].astype('object')
# 0 0
# 1 1
# 2 NaN
# 3 2
# 4 NaN
# Name: col_3, dtype: object
複数の列を型変換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [1, 4, 9, 16, 25],
'col_2': [2.4, 5.1, 10.3, 17.9, 26.0],
'col_3': [0, 1, np.nan, 2, None],
'col_4': [True, True, False, False, True],
})
print(df)
# col_1 col_2 col_3 col_4
# 0 1 2.4 0.0 True
# 1 4 5.1 1.0 True
# 2 9 10.3 NaN False
# 3 16 17.9 2.0 False
# 4 25 26.0 NaN True
print(df.dtypes)
# col_1 int64
# col_2 float64
# col_3 float64
# col_4 bool
# dtype: object
複数の列を型変換
df.astype({'col_1': 'float', 'col_2': 'int'})
# col_1 col_2 col_3 col_4
# 0 1.0 2 0.0 True
# 1 4.0 5 1.0 True
# 2 9.0 10 NaN False
# 3 16.0 17 2.0 False
# 4 25.0 26 NaN True
全ての列を型変換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'col_1': [1, 4, 9, 16, 25],
'col_2': [2.4, 5.1, 10.3, 17.9, 26.0],
'col_3': [0, 1, np.nan, 2, None],
'col_4': [True, True, False, False, True],
})
print(df)
# col_1 col_2 col_3 col_4
# 0 1 2.4 0.0 True
# 1 4 5.1 1.0 True
# 2 9 10.3 NaN False
# 3 16 17.9 2.0 False
# 4 25 26.0 NaN True
print(df.dtypes)
# col_1 int64
# col_2 float64
# col_3 float64
# col_4 bool
# dtype: object
全ての列を型変換
df.astype('bool')
# col_1 col_2 col_3 col_4
# 0 True True False True
# 1 True True True True
# 2 True True True False
# 3 True True True False
# 4 True True True True
日付型への変換
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
文字列→日時型 | ★★★★★ | pd.to_datetime(df['列名']) | Series |
8桁の数値→日時型 | ★★☆☆☆ | pd.to_datetime(df['列名'], format='%Y%m%d') | Series |
シリアル値→日時型 | ★★☆☆☆ | pd.to_timedelta(df['列名'], unit='D') + pd.to_datetime('1900-01-01') | Series |
文字列→日時型
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': ['2018-03-01', '2019-04-02', '2019-04-15'],
'col_2': [20180301, 20190402, 20190415],
'col_3': [43889, 43573, 43568],
})
print(df)
# col_1 col_2 col_3
# 0 2018-03-01 20180301 43889
# 1 2019-04-02 20190402 43573
# 2 2019-04-15 20190415 43568
print(df.dtypes)
# col_1 object
# col_2 int64
# col_3 int64
# dtype: object
文字列→日時型
pd.to_datetime(df['col_1'])
# 0 2018-03-01
# 1 2019-04-02
# 2 2019-04-15
# Name: col_1, dtype: datetime64[ns]
8桁の数値→日時型
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': ['2018-03-01', '2019-04-02', '2019-04-15'],
'col_2': [20180301, 20190402, 20190415],
'col_3': [43889, 43573, 43568],
})
print(df)
# col_1 col_2 col_3
# 0 2018-03-01 20180301 43889
# 1 2019-04-02 20190402 43573
# 2 2019-04-15 20190415 43568
print(df.dtypes)
# col_1 object
# col_2 int64
# col_3 int64
# dtype: object
8桁の数値→日時型
pd.to_datetime(df['col_2'], format='%Y%m%d')
# 0 2018-03-01
# 1 2019-04-02
# 2 2019-04-15
# Name: col_2, dtype: datetime64[ns]
シリアル値→日時型
サンプルデータ
import pandas as pd
df = pd.DataFrame(
data={
'col_1': ['2018-03-01', '2019-04-02', '2019-04-15'],
'col_2': [20180301, 20190402, 20190415],
'col_3': [43889, 43573, 43568],
})
print(df)
# col_1 col_2 col_3
# 0 2018-03-01 20180301 43889
# 1 2019-04-02 20190402 43573
# 2 2019-04-15 20190415 43568
print(df.dtypes)
# col_1 object
# col_2 int64
# col_3 int64
# dtype: object
シリアル値→日時型
pd.to_timedelta(df['col_3'], unit='D') + pd.to_datetime('1900-01-01')
# 0 2018-03-01
# 1 2019-04-02
# 2 2019-04-15
# Name: col_3, dtype: datetime64[ns]
二値化
逆引き | コマンド | 戻り値 |
---|---|---|
カテゴリ変数をone-hotエンコーディング | pd.get_dummies(df) | pd.DataFrame |
条件でone-hotエンコーディング | np.where(条件式, 1, 0) | np.ndarray |
ダミー変数化
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
# 血液型
d = {1: 'A', 2: 'B', 3: 'O', 4: 'AB'}
bloods = [d.get(i) for i in np.random.randint(1, 5, len(names))]
# データフレームを作成
df = pd.DataFrame(data={
'name': names,
'blood': bloods,
})
print(df)
# name blood
# 0 Arthur AB
# 1 Allyson A
# 2 Arnold AB
# 3 Ayden B
# 4 Alex AB
# 5 Allen AB
# 6 Alberto O
# 7 Anthony B
# 8 Amira O
# 9 Aylin O
ダミー変数化
pd.merge(left=df.drop(columns=['blood']),
right=pd.get_dummies(df['blood']),
left_index=True,
right_index=True)
# name A AB B O
# 0 Arthur 0 1 0 0
# 1 Allyson 1 0 0 0
# 2 Arnold 0 1 0 0
# 3 Ayden 0 0 1 0
# 4 Alex 0 1 0 0
# 5 Allen 0 1 0 0
# 6 Alberto 0 0 0 1
# 7 Anthony 0 0 1 0
# 8 Amira 0 0 0 1
# 9 Aylin 0 0 0 1
条件でone-hotエンコーディング
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam', 'Hudson', 'Alex'
]
# 点数
scores = np.random.randint(0, 100, len(names))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'score': scores})
print(df)
# name score
# 0 Noah 69
# 1 Liam 84
# 2 Elijah 17
# 3 Oliver 85
# 4 James 91
# 5 Mason 8
# 6 Logan 10
# 7 Lucas 48
# 8 Mateo 30
# 9 Ethan 68
# 10 Jacob 73
# 11 Anthony 47
# 12 Joseph 20
# 13 Luke 28
# 14 Isaiah 57
# 15 Nicholas 75
# 16 Aaron 17
# 17 Connor 65
# 18 Jose 4
# 19 Adam 33
条件でone-hotエンコーディング
df['is_pass'] = np.where(df['score'] >= 60, 1, 0)
print(df)
# name score is_pass
# 0 Noah 69 1
# 1 Liam 84 1
# 2 Elijah 17 0
# 3 Oliver 85 1
# 4 James 91 1
# 5 Mason 8 0
# 6 Logan 10 0
# 7 Lucas 48 0
# 8 Mateo 30 0
# 9 Ethan 68 1
# 10 Jacob 73 1
# 11 Anthony 47 0
# 12 Joseph 20 0
# 13 Luke 28 0
# 14 Isaiah 57 0
# 15 Nicholas 75 1
# 16 Aaron 17 0
# 17 Connor 65 1
# 18 Jose 4 0
# 19 Adam 33 0
カテゴリ化
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
ビニング(階級幅に変換) | ★★★★★ | ← | Series |
カテゴリデータに新規IDを振る | ★★★★☆ | df['列名'].astype('category').cat.codes | Series |
順序付きカテゴリデータに新規IDを振る | ★★★★☆ | ← | Series |
ビニング(階級幅に変換)
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
ages = np.random.randint(10, 80, len(names))
df = pd.DataFrame(data={'name': names, 'age': ages})
print(df)
# name age
# 0 Arthur 59
# 1 Allyson 17
# 2 Arnold 22
# 3 Ayden 68
# 4 Alex 14
# 5 Allen 58
# 6 Alberto 55
# 7 Anthony 51
# 8 Amira 79
# 9 Aylin 11
ビニング(階級幅に変換)
df['age_range'] = pd.cut(
x=df['age'],
bins=[-1, 17, 24, 34, 44, 54, 64, df['age'].max()],
labels=['0-17', '18-24', '25-34', '35-44', '45-54', '55-64', '65-'])
print(df)
# name age age_range
# 0 Arthur 59 55-64
# 1 Allyson 17 0-17
# 2 Arnold 22 18-24
# 3 Ayden 68 65-
# 4 Alex 14 0-17
# 5 Allen 58 55-64
# 6 Alberto 55 55-64
# 7 Anthony 51 45-54
# 8 Amira 79 65-
# 9 Aylin 11 0-17
カテゴリデータに新規IDを振る
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
# 血液型
d = {1: 'A', 2: 'B', 3: 'O', 4: 'AB'}
bloods = [d.get(i) for i in np.random.randint(1, 5, len(names))]
# データフレームを作成
df = pd.DataFrame(data={
'name': names,
'blood': bloods,
})
print(df)
# name blood
# 0 Arthur O
# 1 Allyson B
# 2 Arnold O
# 3 Ayden B
# 4 Alex O
# 5 Allen B
# 6 Alberto A
# 7 Anthony AB
# 8 Amira AB
# 9 Aylin O
カテゴリデータに新規IDを振る
df['cat'] = df['blood'].astype('category').cat.codes
print(df)
# name blood cat
# 0 Arthur O 3
# 1 Allyson B 2
# 2 Arnold O 3
# 3 Ayden B 2
# 4 Alex O 3
# 5 Allen B 2
# 6 Alberto A 0
# 7 Anthony AB 1
# 8 Amira AB 1
# 9 Aylin O 3
順序付きカテゴリデータに新規IDを振る
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
# 血液型
d = {1: 'A', 2: 'B', 3: 'O', 4: 'AB'}
bloods = [d.get(i) for i in np.random.randint(1, 5, len(names))]
# データフレームを作成
df = pd.DataFrame(data={
'name': names,
'blood': bloods,
})
print(df)
# name blood
# 0 Arthur O
# 1 Allyson B
# 2 Arnold O
# 3 Ayden B
# 4 Alex O
# 5 Allen B
# 6 Alberto A
# 7 Anthony AB
# 8 Amira AB
# 9 Aylin O
順序付きカテゴリデータに新規IDを振る
from pandas.api.types import CategoricalDtype
cats = ['A', 'B', 'O', 'AB']
cat_type = CategoricalDtype(categories=cats, ordered=True)
df['cat'] = df['blood'].astype(cat_type).cat.codes
print(df)
# name blood cat
# 0 Arthur O 2
# 1 Allyson B 1
# 2 Arnold O 2
# 3 Ayden B 1
# 4 Alex O 2
# 5 Allen B 1
# 6 Alberto A 0
# 7 Anthony AB 3
# 8 Amira AB 3
# 9 Aylin O 2
正規化
ハッシュ化
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
ハッシュ化 | ★★★★☆ | ← | Series |
ハッシュ化
サンプルデータ
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
mails = [f'{chr(97+idx)*8}@sample.com' for idx, _ in enumerate(names)]
df = pd.DataFrame(data={'name': names, 'mail': mails})
print(df)
# name mail
# 0 Arthur aaaaaaaa@sample.com
# 1 Allyson bbbbbbbb@sample.com
# 2 Arnold cccccccc@sample.com
# 3 Ayden dddddddd@sample.com
# 4 Alex eeeeeeee@sample.com
# 5 Allen ffffffff@sample.com
# 6 Alberto gggggggg@sample.com
# 7 Anthony hhhhhhhh@sample.com
# 8 Amira iiiiiiii@sample.com
# 9 Aylin jjjjjjjj@sample.com
ハッシュ化
import hashlib
df['mail'] = df['mail'].astype('str').apply(lambda n: hashlib.sha256(n.encode()).hexdigest())
print(df)
# name mail
# 0 Arthur 2ae718aaf1e7b62998d4712b25a459689a38b92a5091dd...
# 1 Allyson 8a24570d33af76900570020d39a4943562bb2947967551...
# 2 Arnold 7384fd82f8b3d0b449ba7e777362c4bdb43fb4d5802dfc...
# 3 Ayden 870d6c80a35b3e0a9bb7959cc5d0cbd8aeee4fd8de256d...
# 4 Alex 624e4fab44579db175d52a8d96f7dab873310fe022c135...
# 5 Allen 988cec7c715de15c40f9847241a12d6b0cff7c739c86fa...
# 6 Alberto 3ba00352f9a878d3719d957814ad64ada6481f0fb57130...
# 7 Anthony d03994b6cfbb462c42ac7f4cb601c0cc3f165ede9c7a8d...
# 8 Amira 5b5286952dcb952c3e21840f5d449d77973bacac714321...
# 9 Aylin 05ba073f69ef77701946fd8662b9a0ef237fdccc719e17...
要素の置換
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
辞書で要素を置換 | ★★★★☆ | df['列名'].apply(lambda x: {'検索値': '置換値'}.get(x, x)) | Series |
正規表現に一致する要素を置換 | ★★★★★ | df['列名'].str.replace(r'正規表現', '置換値') | Series |
bool値のシリーズに一致した行番号の要素を置換 | ★★★☆☆ | df.loc[bool値のシリーズ, '列名'] = '値' | |
bool値のシリーズに一致した行番号の要素を置換 | ★★★★★ | df['列名'].mask(bool値のシリーズ, '値') | Series |
boolデータフレームに一致した要素を置換 | ★★★★☆ | df.mask(bool値のデータフレーム, '値') | DataFrame |
辞書で要素を置換
サンプルデータ
import pandas as pd
df = pd.DataFrame({
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
})
print(df)
# col_1 col_2
# 0 apple 200
# 1 banana 100
# 2 apple 250
# 3 cherry 400
# 4 banana 300
辞書で要素を置換
d = {'apple': 'APPLE', 'banana': 'BANANA'}
df['col_1'] = df['col_1'].apply(lambda x: d.get(x, x))
print(df)
# col_1 col_2
# 0 APPLE 200
# 1 BANANA 100
# 2 APPLE 250
# 3 cherry 400
# 4 BANANA 300
正規表現に一致する要素を置換
サンプルデータ
import pandas as pd
df = pd.DataFrame({
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
})
print(df)
# col_1 col_2
# 0 apple 200
# 1 banana 100
# 2 apple 250
# 3 cherry 400
# 4 banana 300
正規表現に一致する要素を置換
# 同じ小文字のアルファベットが使われている箇所にマッチ
pattern = r'([a-z])1'
df['col_1'] = df['col_1'].str.replace(pattern, '__')
print(df)
# col_1 col_2
# 0 a__le 200
# 1 banana 100
# 2 a__le 250
# 3 che__y 400
# 4 banana 300
bool値のシリーズに一致した行番号の要素を置換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame({
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
})
print(df)
# col_1 col_2
# 0 apple 200
# 1 banana 100
# 2 apple 250
# 3 cherry 400
# 4 banana 300
bool値のシリーズに一致した行番号の要素を置換
# col_1列の要素がappleだった場合、同じ行番号のcol_2列の要素を欠損値に置き換える
df.loc[df['col_1'] == 'apple', 'col_2'] = np.nan
print(df)
# col_1 col_2
# 0 apple NaN
# 1 banana 100.0
# 2 apple NaN
# 3 cherry 400.0
# 4 banana 300.0
bool値のシリーズに一致した行番号の要素を置換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame({
'col_1': ['apple', 'banana', 'apple', 'cherry', 'banana'],
'col_2': [200, 100, 250, 400, 300]
})
print(df)
# col_1 col_2
# 0 apple 200
# 1 banana 100
# 2 apple 250
# 3 cherry 400
# 4 banana 300
bool値のシリーズに一致した行番号の要素を置換
# col_1列の要素がappleだった場合、同じ行番号のcol_2列の要素を欠損値に置き換える
df['col_2'] = df['col_2'].mask(df['col_1'] == 'apple', np.nan)
print(df)
# col_1 col_2
# 0 apple NaN
# 1 banana 100.0
# 2 apple NaN
# 3 cherry 400.0
# 4 banana 300.0
boolデータフレームに一致した要素を置換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
{
'のび太': np.random.randint(0, 20, 5),
'スネ夫': np.random.randint(55, 75, 5),
'ジャイアン': np.random.randint(45, 70, 5),
'しずか': np.random.randint(85, 95, 5),
'出木杉': np.random.randint(90, 100, 5)
},
index=['国語', '英語', '算数', '理科', '社会']).T
print(df.to_markdown())
# | | 国語 | 英語 | 算数 | 理科 | 社会 |
# |:------|-------:|-------:|-------:|-------:|-------:|
# | のび太 | 4 | 17 | 4 | 0 | 0 |
# | スネ夫 | 61 | 58 | 60 | 63 | 59 |
# | たけし | 68 | 51 | 68 | 59 | 45 |
# | しずか | 87 | 87 | 90 | 85 | 94 |
# | 出木杉 | 93 | 99 | 99 | 95 | 99 |
boolデータフレームに一致した要素を置換
# 60点未満を不可に置換
df.mask(df<60, '不可')
# | | 国語 | 英語 | 算数 | 理科 | 社会 |
# |:------|-------:|-------:|-------:|-------:|--------:|
# | のび太 | 不可 | 不可 | 不可 | 不可 | 不可 |
# | スネ夫 | 61 | 不可 | 60 | 63 | 不可 |
# | たけし | 68 | 不可 | 68 | 不可 | 不可 |
# | しずか | 87 | 87 | 90 | 85 | 94 |
# | 出木杉 | 93 | 99 | 99 | 95 | 99 |
各データ型の操作
数値
端数処理
順位付け
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
同一順位ありの順位付け | ★★★☆☆ | df['列名'].rank(ascending=False, method='min') | Series |
スケール変換
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
正規化(0〜1にスケール変換) | ★★★★★ | ← | ndarray |
標準化(平均0、標準偏差1にスケール変換) | ★★★★★ | ← | ndarray |
正規化(0〜1にスケール変換)
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
正規化(0〜1にスケール変換)
from sklearn import preprocessing as pp
# 数値のデータフレーム
Ndf = df.drop(columns='species')
# 正規化する
scaler = pp.MinMaxScaler()
df[Ndf.columns] = pd.DataFrame(data=scaler.fit_transform(Ndf),
columns=Ndf.columns)
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 0.222222 0.625000 0.067797 0.041667 setosa
# 1 0.166667 0.416667 0.067797 0.041667 setosa
# 2 0.111111 0.500000 0.050847 0.041667 setosa
# 3 0.083333 0.458333 0.084746 0.041667 setosa
# 4 0.194444 0.666667 0.067797 0.041667 setosa
# .. ... ... ... ... ...
# 145 0.666667 0.416667 0.711864 0.916667 virginica
# 146 0.555556 0.208333 0.677966 0.750000 virginica
# 147 0.611111 0.416667 0.711864 0.791667 virginica
# 148 0.527778 0.583333 0.745763 0.916667 virginica
# 149 0.444444 0.416667 0.694915 0.708333 virginica
#
# [150 rows x 5 columns]
print(df.describe())
# sepal_length sepal_width petal_length petal_width
# count 150.000000 150.000000 150.000000 150.000000
# mean 0.428704 0.440556 0.467458 0.458056
# std 0.230018 0.181611 0.299203 0.317599
# min 0.000000 0.000000 0.000000 0.000000
# 25% 0.222222 0.333333 0.101695 0.083333
# 50% 0.416667 0.416667 0.567797 0.500000
# 75% 0.583333 0.541667 0.694915 0.708333
# max 1.000000 1.000000 1.000000 1.000000
標準化(平均0、標準偏差1にスケール変換)
サンプルデータ
import pandas as pd
import seaborn as sns
# アイリスデータセット
df = sns.load_dataset('iris')
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
#
# [150 rows x 5 columns]
標準化(平均0、標準偏差1にスケール変換)
from sklearn import preprocessing as pp
# 数値のデータフレーム
Ndf = df.drop(columns='species')
# 標準化する
scaler = pp.StandardScaler()
df[Ndf.columns] = pd.DataFrame(data=scaler.fit_transform(Ndf),
columns=Ndf.columns)
print(df)
# sepal_length sepal_width petal_length petal_width species
# 0 -0.900681 1.019004 -1.340227 -1.315444 setosa
# 1 -1.143017 -0.131979 -1.340227 -1.315444 setosa
# 2 -1.385353 0.328414 -1.397064 -1.315444 setosa
# 3 -1.506521 0.098217 -1.283389 -1.315444 setosa
# 4 -1.021849 1.249201 -1.340227 -1.315444 setosa
# .. ... ... ... ... ...
# 145 1.038005 -0.131979 0.819596 1.448832 virginica
# 146 0.553333 -1.282963 0.705921 0.922303 virginica
# 147 0.795669 -0.131979 0.819596 1.053935 virginica
# 148 0.432165 0.788808 0.933271 1.448832 virginica
# 149 0.068662 -0.131979 0.762758 0.790671 virginica
#
# [150 rows x 5 columns]
print(df.describe())
# sepal_length sepal_width petal_length petal_width
# count 1.500000e+02 1.500000e+02 1.500000e+02 1.500000e+02
# mean -2.775558e-16 -9.695948e-16 -8.652338e-16 -4.662937e-16
# std 1.003350e+00 1.003350e+00 1.003350e+00 1.003350e+00
# min -1.870024e+00 -2.433947e+00 -1.567576e+00 -1.447076e+00
# 25% -9.006812e-01 -5.923730e-01 -1.226552e+00 -1.183812e+00
# 50% -5.250608e-02 -1.319795e-01 3.364776e-01 1.325097e-01
# 75% 6.745011e-01 5.586108e-01 7.627583e-01 7.906707e-01
# max 2.492019e+00 3.090775e+00 1.785832e+00 1.712096e+00
フォーマット変換
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
3桁のカンマ区切り表記 | ★★★★☆ | df['列名'].apply(lambda n: f'{n:,}') | Series |
小数点第2位の丸める | ★★★★☆ | df['列名'].apply(lambda n: f'{n:.2f}') | Series |
パーセンテージ表記 | ★★★★☆ | df['列名'].apply(lambda n: f'{n:.2%}') | Series |
4桁で0埋め | ★★☆☆☆ | df['列名'].apply(lambda n: f'{n:0=4}') | Series |
3桁のカンマ区切り表記
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data={
'col_1': np.random.randint(1, 30, 5),
'col_2': np.random.randint(1000, 10000000, 5),
'col_3': np.random.random(5),
})
print(df)
# col_1 col_2 col_3
# 0 28 5954087 0.055722
# 1 13 1739013 0.328337
# 2 17 5120682 0.754990
# 3 21 7628738 0.264615
# 4 3 9777724 0.189377
3桁のカンマ区切り表記
df['col_2'].apply(lambda n: f'{n:,}')
# 0 5,954,087
# 1 1,739,013
# 2 5,120,682
# 3 7,628,738
# 4 9,777,724
# Name: col_2, dtype: object
小数点以下の桁数指定
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data={
'col_1': np.random.randint(1, 30, 5),
'col_2': np.random.randint(1000, 10000000, 5),
'col_3': np.random.random(5),
})
print(df)
# col_1 col_2 col_3
# 0 28 5954087 0.055722
# 1 13 1739013 0.328337
# 2 17 5120682 0.754990
# 3 21 7628738 0.264615
# 4 3 9777724 0.189377
小数点以下の桁数指定
df['col_3'].apply(lambda n: f'{n:.2f}')
# 0 0.06
# 1 0.33
# 2 0.75
# 3 0.26
# 4 0.19
# Name: col_3, dtype: object
パーセント表示
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data={
'col_1': np.random.randint(1, 30, 5),
'col_2': np.random.randint(1000, 10000000, 5),
'col_3': np.random.random(5),
})
print(df)
# col_1 col_2 col_3
# 0 28 5954087 0.055722
# 1 13 1739013 0.328337
# 2 17 5120682 0.754990
# 3 21 7628738 0.264615
# 4 3 9777724 0.189377
パーセント表示
df['col_3'].apply(lambda n: f'{n:.2%}')
# 0 5.57%
# 1 32.83%
# 2 75.50%
# 3 26.46%
# 4 18.94%
# Name: col_3, dtype: object
4桁で0埋め
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data={
'col_1': np.random.randint(1, 30, 5),
'col_2': np.random.randint(1000, 10000000, 5),
'col_3': np.random.random(5),
})
print(df)
# col_1 col_2 col_3
# 0 28 5954087 0.055722
# 1 13 1739013 0.328337
# 2 17 5120682 0.754990
# 3 21 7628738 0.264615
# 4 3 9777724 0.189377
4桁で0埋め
df['col_1'].apply(lambda n: f'{n:0=4}')
# 0 0028
# 1 0013
# 2 0017
# 3 0021
# 4 0003
# Name: col_1, dtype: object
基数変換
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
2進数に変換 | ★★☆☆☆ | df['列名'].apply(lambda n: f'{n:b}') | Series |
8進数に変換 | ★☆☆☆☆ | df['列名'].apply(lambda n: f'{n:o}') | Series |
16進数に変換(小文字) | ★★☆☆☆ | df['列名'].apply(lambda n: f'{n:x}') | Series |
16進数に変換(大文字) | ★★☆☆☆ | df['列名'].apply(lambda n: f'{n:X}') | Series |
2進数に変換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data={
'col_1': np.random.randint(1, 30, 5),
'col_2': np.random.randint(1000, 10000000, 5),
'col_3': np.random.random(5),
})
print(df)
# col_1 col_2 col_3
# 0 28 5954087 0.055722
# 1 13 1739013 0.328337
# 2 17 5120682 0.754990
# 3 21 7628738 0.264615
# 4 3 9777724 0.189377
2進数に変換
df['col_1'].apply(lambda n: f'{n:b}')
# 0 11100
# 1 1101
# 2 10001
# 3 10101
# 4 11
# Name: col_1, dtype: object
8進数に変換
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data={
'col_1': np.random.randint(1, 30, 5),
'col_2': np.random.randint(1000, 10000000, 5),
'col_3': np.random.random(5),
})
print(df)
# col_1 col_2 col_3
# 0 28 5954087 0.055722
# 1 13 1739013 0.328337
# 2 17 5120682 0.754990
# 3 21 7628738 0.264615
# 4 3 9777724 0.189377
8進数に変換
df['col_1'].apply(lambda n: f'{n:o}')
# 0 34
# 1 15
# 2 21
# 3 25
# 4 3
# Name: col_1, dtype: object
16進数に変換(小文字)
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data={
'col_1': np.random.randint(1, 30, 5),
'col_2': np.random.randint(1000, 10000000, 5),
'col_3': np.random.random(5),
})
print(df)
# col_1 col_2 col_3
# 0 28 5954087 0.055722
# 1 13 1739013 0.328337
# 2 17 5120682 0.754990
# 3 21 7628738 0.264615
# 4 3 9777724 0.189377
16進数に変換(小文字)
df['col_1'].apply(lambda n: f'{n:x}')
# 0 1c
# 1 d
# 2 11
# 3 15
# 4 3
# Name: col_1, dtype: object
16進数に変換(大文字)
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data={
'col_1': np.random.randint(1, 30, 5),
'col_2': np.random.randint(1000, 10000000, 5),
'col_3': np.random.random(5),
})
print(df)
# col_1 col_2 col_3
# 0 28 5954087 0.055722
# 1 13 1739013 0.328337
# 2 17 5120682 0.754990
# 3 21 7628738 0.264615
# 4 3 9777724 0.189377
16進数に変換(大文字)
df['col_1'].apply(lambda n: f'{n:X}')
# 0 1C
# 1 D
# 2 11
# 3 15
# 4 3
# Name: col_1, dtype: object
ランク付け
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
# 点数
scores = np.random.randint(1, 100, len(names))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'score': scores})
print(df)
# name score
# 0 Arthur 85
# 1 Allyson 45
# 2 Arnold 75
# 3 Ayden 13
# 4 Alex 88
# 5 Allen 61
# 6 Alberto 45
# 7 Anthony 55
# 8 Amira 68
# 9 Aylin 38
ランク付け
# 点数が高いほど高順位、同点はどちらも繰り上げる
df['rank'] = df['score'].rank(ascending=False, method='min')
print(df)
# name score rank
# 0 Arthur 85 2.0
# 1 Allyson 45 7.0
# 2 Arnold 75 3.0
# 3 Ayden 13 10.0
# 4 Alex 88 1.0
# 5 Allen 61 5.0
# 6 Alberto 45 7.0
# 7 Anthony 55 6.0
# 8 Amira 68 4.0
# 9 Aylin 38 9.0
文字列
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
小文字→大文字 | ★★☆☆☆ | df['列名'].astype('str').str.upper() | Series |
大文字→小文字 | ★★☆☆☆ | df['列名'].astype('str').str.lower() | Series |
小文字→大文字
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
ages = np.random.randint(10, 80, len(names))
df = pd.DataFrame(data={'name': names, 'age': ages})
print(df)
# name age
# 0 Arthur 32
# 1 Allyson 37
# 2 Arnold 66
# 3 Ayden 33
# 4 Alex 70
# 5 Allen 71
# 6 Alberto 33
# 7 Anthony 76
# 8 Amira 59
# 9 Aylin 75
小文字→大文字
df['name'] = df['name'].astype('str').str.upper()
print(df)
# name age
# 0 ARTHUR 32
# 1 ALLYSON 37
# 2 ARNOLD 66
# 3 AYDEN 33
# 4 ALEX 70
# 5 ALLEN 71
# 6 ALBERTO 33
# 7 ANTHONY 76
# 8 AMIRA 59
# 9 AYLIN 75
大文字→小文字
サンプルデータ
import numpy as np
import pandas as pd
names = [
'Arthur', 'Allyson', 'Arnold', 'Ayden', 'Alex', 'Allen', 'Alberto',
'Anthony', 'Amira', 'Aylin'
]
ages = np.random.randint(10, 80, len(names))
df = pd.DataFrame(data={'name': names, 'age': ages})
print(df)
# name age
# 0 Arthur 32
# 1 Allyson 37
# 2 Arnold 66
# 3 Ayden 33
# 4 Alex 70
# 5 Allen 71
# 6 Alberto 33
# 7 Anthony 76
# 8 Amira 59
# 9 Aylin 75
大文字→小文字
df['name'] = df['name'].astype('str').str.lower()
print(df)
# name age
# 0 arthur 32
# 1 allyson 37
# 2 arnold 66
# 3 ayden 33
# 4 alex 70
# 5 allen 71
# 6 alberto 33
# 7 anthony 76
# 8 amira 59
# 9 aylin 75
日付型
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
年を取得 | ★★★★☆ | df['列名'].dt.year | Series |
月を取得 | ★★★★☆ | df['列名'].dt.month | Series |
日を取得 | ★★★★☆ | df['列名'].dt.day | Series |
時を取得 | ★★★★☆ | df['列名'].dt.hour | Series |
分を取得 | ★★★☆☆ | df['列名'].dt.minute | Series |
秒を取得 | ★★★☆☆ | df['列名'].dt.second | Series |
曜日(0=月曜日、6=日曜日)を取得 | ★★★★☆ | df['列名'].dt.weekday | Series |
曜日(英語)を取得 | ★★★☆☆ | df['列名'].dt.day_name() | Series |
曜日(漢字)を取得 | ★★★★☆ | df['列名'].dt.day_name(locale='ja_JP.UTF-8') | Series |
日本の休日(土日祝)判定 | ★★★★★ | ← | Series |
フォーマットを指定して取得 | ★★★★★ | df['列名'].dt.strftime('フォーマット') | Series |
列同士の差(年、月、日)を取得 | ★★★★★ | (df['列名1'] - df['列名2']).astype('timedelta64[時間の単位]') | Series |
指定した日からの差(年、月、日)を取得 | ★★★★☆ | (pd.Timestamp('YYYY-mm-dd') - df['列名']).astype('timedelta64[時間の単位]') | Series |
今日からの差(年、月、日)を取得 | ★★★★☆ | (pd.Timestamp.now() - df['列名']).astype('timedelta64[時間の単位]') | Series |
日付を増減する | ★★☆☆☆ | ← | Series |
年を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
年を取得
df['hire_date'].dt.year
# 0 2005
# 1 2006
# 2 2005
# 3 2002
# 4 2004
# 5 2005
# Name: hire_date, dtype: int64
月を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
月を取得
df['hire_date'].dt.month
# 0 3
# 1 4
# 2 10
# 3 10
# 4 9
# 5 1
# Name: hire_date, dtype: int64
日を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
日を取得
df['hire_date'].dt.day
# 0 19
# 1 19
# 2 10
# 3 10
# 4 8
# 5 10
# Name: hire_date, dtype: int64
時を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
時を取得
df['seniority_start_time'].dt.hour
# 0 15.0
# 1 NaN
# 2 NaN
# 3 12.0
# 4 NaN
# 5 14.0
# Name: seniority_start_time, dtype: float64
分を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
分を取得
df['seniority_start_time'].dt.minute
# 0 56.0
# 1 NaN
# 2 NaN
# 3 30.0
# 4 NaN
# 5 40.0
# Name: seniority_start_time, dtype: float64
秒を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
秒を取得
df['seniority_start_time'].dt.second
# 0 30.0
# 1 NaN
# 2 NaN
# 3 45.0
# 4 NaN
# 5 10.0
# Name: seniority_start_time, dtype: float64
曜日(0=月曜日、6=日曜日)を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
曜日(0=月曜日、6=日曜日)を取得
df['hire_date'].dt.weekday
# 0 5
# 1 2
# 2 0
# 3 3
# 4 2
# 5 0
# Name: hire_date, dtype: int64
曜日(英語)を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
曜日(英語)を取得
df['hire_date'].dt.day_name()
# 0 Saturday
# 1 Wednesday
# 2 Monday
# 3 Thursday
# 4 Wednesday
# 5 Monday
# Name: hire_date, dtype: object
曜日(漢字)を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
曜日(漢字)を取得
df['hire_date'].dt.day_name(locale='ja_JP.UTF-8')
# 0 土曜日
# 1 水曜日
# 2 月曜日
# 3 木曜日
# 4 水曜日
# 5 月曜日
# Name: hire_date, dtype: object
日本の休日(土日祝)判定
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.random.randint(1, 7, 31),
index=pd.date_range('2020-01-01', periods=31, freq='D'),
columns=['dice'])
df = df.reset_index()
df = df.rename(columns={'index': 'date'})
df['weekday'] = df['date'].dt.day_name()
print(df)
# date dice weekday
# 0 2020-01-01 5 Wednesday
# 1 2020-01-02 2 Thursday
# 2 2020-01-03 5 Friday
# 3 2020-01-04 2 Saturday
# 4 2020-01-05 6 Sunday
# 5 2020-01-06 1 Monday
# 6 2020-01-07 1 Tuesday
# 7 2020-01-08 4 Wednesday
# 8 2020-01-09 5 Thursday
# 9 2020-01-10 6 Friday
# 10 2020-01-11 2 Saturday
# 11 2020-01-12 6 Sunday
# 12 2020-01-13 2 Monday
# 13 2020-01-14 5 Tuesday
# 14 2020-01-15 5 Wednesday
# 15 2020-01-16 4 Thursday
# 16 2020-01-17 2 Friday
# 17 2020-01-18 2 Saturday
# 18 2020-01-19 5 Sunday
# 19 2020-01-20 4 Monday
# 20 2020-01-21 4 Tuesday
# 21 2020-01-22 6 Wednesday
# 22 2020-01-23 6 Thursday
# 23 2020-01-24 3 Friday
# 24 2020-01-25 6 Saturday
# 25 2020-01-26 5 Sunday
# 26 2020-01-27 4 Monday
# 27 2020-01-28 1 Tuesday
# 28 2020-01-29 3 Wednesday
# 29 2020-01-30 6 Thursday
# 30 2020-01-31 4 Friday
日本の休日(土日祝)判定
import jpholiday # pip install jpholiday
df['is_jp_holiday'] = df['date'].apply(lambda d: True if 5 <= d.weekday() <= 6
or jpholiday.is_holiday(d) else False)
print(df)
# date dice weekday is_jp_holiday
# 0 2020-01-01 5 Wednesday True
# 1 2020-01-02 2 Thursday False
# 2 2020-01-03 5 Friday False
# 3 2020-01-04 2 Saturday True
# 4 2020-01-05 6 Sunday True
# 5 2020-01-06 1 Monday False
# 6 2020-01-07 1 Tuesday False
# 7 2020-01-08 4 Wednesday False
# 8 2020-01-09 5 Thursday False
# 9 2020-01-10 6 Friday False
# 10 2020-01-11 2 Saturday True
# 11 2020-01-12 6 Sunday True
# 12 2020-01-13 2 Monday True
# 13 2020-01-14 5 Tuesday False
# 14 2020-01-15 5 Wednesday False
# 15 2020-01-16 4 Thursday False
# 16 2020-01-17 2 Friday False
# 17 2020-01-18 2 Saturday True
# 18 2020-01-19 5 Sunday True
# 19 2020-01-20 4 Monday False
# 20 2020-01-21 4 Tuesday False
# 21 2020-01-22 6 Wednesday False
# 22 2020-01-23 6 Thursday False
# 23 2020-01-24 3 Friday False
# 24 2020-01-25 6 Saturday True
# 25 2020-01-26 5 Sunday True
# 26 2020-01-27 4 Monday False
# 27 2020-01-28 1 Tuesday False
# 28 2020-01-29 3 Wednesday False
# 29 2020-01-30 6 Thursday False
# 30 2020-01-31 4 Friday False
フォーマットを指定して取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
フォーマットを指定して取得
df['hire_date'].dt.strftime('%Y-%m')
# 0 2005-03
# 1 2006-04
# 2 2005-10
# 3 2002-10
# 4 2004-09
# 5 2005-01
# Name: hire_date, dtype: object
- 4桁の西暦:
%Y
- 2桁の西暦:
%y
- 2桁の月:
%m
- 2桁の日:
%d
- 2桁の時:
%H
- 2桁の分:
%M
- 2桁の秒:
%S
その他のフォーマットはこちらから
列同士の差(年、月、日)を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
列同士の年数差を取得
(df['seniority_start_time'] - df['hire_date']).astype('timedelta64[Y]')
# 0 2.0
# 1 NaN
# 2 NaN
# 3 2.0
# 4 NaN
# 5 2.0
# dtype: float64
列同士の月数差を取得
(df['seniority_start_time'] - df['hire_date']).astype('timedelta64[M]')
# 0 32.0
# 1 NaN
# 2 NaN
# 3 28.0
# 4 NaN
# 5 35.0
# dtype: float64
列同士の日数差を取得
(df['seniority_start_time'] - df['hire_date']).astype('timedelta64[D]')
# 0 988.0
# 1 NaN
# 2 NaN
# 3 881.0
# 4 NaN
# 5 1084.0
# dtype: float64
指定した日からの差(年、月、日)を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
指定した日からの年数差を取得
(pd.Timestamp('2007-01-01') - df['hire_date']).astype('timedelta64[Y]')
# 0 1.0
# 1 0.0
# 2 1.0
# 3 4.0
# 4 2.0
# 5 1.0
# Name: hire_date, dtype: float64
指定した日からの年数差を取得
(pd.Timestamp('2007-01-01') - df['hire_date']).astype('timedelta64[M]')
# 0 21.0
# 1 8.0
# 2 14.0
# 3 50.0
# 4 27.0
# 5 23.0
# Name: hire_date, dtype: float64
指定した日からの年数差を取得
(pd.Timestamp('2007-01-01') - df['hire_date']).astype('timedelta64[D]')
# 0 653.0
# 1 257.0
# 2 448.0
# 3 1544.0
# 4 845.0
# 5 721.0
# Name: hire_date, dtype: float64
今日からの差(年、月、日)を取得
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
今日からの年数差
(pd.Timestamp.now() - df['hire_date']).astype('timedelta64[Y]')
# 0 15.0
# 1 14.0
# 2 15.0
# 3 18.0
# 4 16.0
# 5 15.0
# Name: hire_date, dtype: float64
今日からの月数差
(pd.Timestamp.now() - df['hire_date']).astype('timedelta64[M]')
# 0 186.0
# 1 173.0
# 2 180.0
# 3 216.0
# 4 193.0
# 5 189.0
# Name: hire_date, dtype: float64
今日からの日数差
(pd.Timestamp.now() - df['hire_date']).astype('timedelta64[D]')
# 0 5690.0
# 1 5294.0
# 2 5485.0
# 3 6581.0
# 4 5882.0
# 5 5758.0
# Name: hire_date, dtype: float64
日付を増減する
サンプルデータ
import numpy as np
import pandas as pd
df = pd.DataFrame(
data={
'name': ['John', 'Dave', 'Sally', 'Ben', 'Dana', 'Mike'],
'dept': ['Eng', 'Eng', 'Eng', 'Sales', 'Sales', 'Marketing'],
'salary': [1000, 500, 600, 400, 350, 800],
'hire_date': [
'2005-03-19', '2006-04-19', '2005-10-10', '2002-10-10',
'2004-09-08', '2005-01-10'
],
'is_senior': [True, False, False, True, False, True],
'seniority_start_time': [
'2007-12-02 15:56:30', np.nan, np.nan, '2005-03-09 12:30:45',
np.nan, '2007-12-30 14:40:10'
]
})
# 日付の文字列を時系列データに変換
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['seniority_start_time'] = pd.to_datetime(df['seniority_start_time'])
print(df)
# name dept salary hire_date is_senior seniority_start_time
# 0 John Eng 1000 2005-03-19 True 2007-12-02 15:56:30
# 1 Dave Eng 500 2006-04-19 False NaT
# 2 Sally Eng 600 2005-10-10 False NaT
# 3 Ben Sales 400 2002-10-10 True 2005-03-09 12:30:45
# 4 Dana Sales 350 2004-09-08 False NaT
# 5 Mike Marketing 800 2005-01-10 True 2007-12-30 14:40:10
日付を増減する
from datetime import timedelta
df['hire_date'] + timedelta(days=10)
# 0 2005-03-29
# 1 2006-04-29
# 2 2005-10-20
# 3 2002-10-20
# 4 2004-09-18
# 5 2005-01-20
# Name: hire_date, dtype: datetime64[ns]
位置情報型
逆引き | コマンド | 戻り値 |
---|---|---|
郵便番号から緯度経度を取得(HeartRails Geo API) | ← | Series , Series |
住所から緯度経度を取得(Geocording API) | ← | Series , Series |
郵便番号から緯度経度を取得(HeartRails Geo API)
サンプルデータ
import pandas as pd
# データフレームを作成
df = pd.DataFrame(data={'zip': ['810-0001', '810-0002', '810-0003', '810-0004']})
print(df)
# zip
# 0 810-0001
# 1 810-0002
# 2 810-0003
# 3 810-0004
郵便番号から緯度経度を取得
import numpy as np
import requests
def zip_to_latlng(zipcode):
url = 'http://geoapi.heartrails.com/api/json'
payload = {'method': 'searchByPostal', 'postal': zipcode}
r = requests.get(url, params=payload)
data = r.json()
# 郵便番号によっては緯度経度が複数ある場合もあるので、平均値をとる
# 例:天神1丁目、天神2丁目、天神3丁目、天神4丁目、天神5丁目
lng = np.mean([float(i['x']) for i in data['response']['location']])
lat = np.mean([float(i['y']) for i in data['response']['location']])
return pd.Series([lat, lng])
df[['lat', 'lng']] = df['zip'].apply(lambda x: zip_to_latlng(x))
print(df)
# zip lat lng
# 0 810-0001 33.592298 130.398421
# 1 810-0002 33.590790 130.405479
# 2 810-0003 33.586764 130.407713
# 3 810-0004 33.585122 130.403964
住所から緯度経度を取得(Geocording API)
サンプルデータ
import numpy as np
import pandas as pd
# データフレームを作成
df = pd.DataFrame(
data={'address': ['福岡県福岡市中央区天神1−1−1', '東京都文京区後楽1丁目3−61', '東京都大田区羽田空港']})
print(df)
# address
# 0 福岡県福岡市中央区天神1−1−1
# 1 東京都文京区後楽1丁目3−61
# 2 東京都大田区羽田空港
住所から緯度経度を取得(Geocording API)
import requests
from bs4 import BeautifulSoup
import time
def address_to_latlng(address):
url = 'https://www.geocoding.jp/api/'
payload = {'v': 1.2,'q': address}
r = requests.get(url, params=payload)
soup = BeautifulSoup(r.content, 'lxml')
lat = float(soup.select_one('lat').get_text())
lng = float(soup.select_one('lng').get_text())
# Geocoding API利用規約で1リクエストごとに10秒待機処理
time.sleep(10)
return pd.Series([lat, lng])
df[['lat', 'lng']] = df['address'].apply(lambda x: address_to_latlng(x))
print(df)
# address lat lng
# 0 福岡県福岡市中央区天神1−1−1 33.591454 130.402435
# 1 東京都文京区後楽1丁目3−61 35.705341 139.752111
# 2 東京都大田区羽田空港 35.543198 139.788214
使用したジオコーディングAPI
- HeartRails Geo API
- Geocoding API:10秒に1回しかリクエストできない
データ集計
要約統計量
逆引き | 使用頻度 | コマンド | 戻り値 |
---|---|---|---|
データフレームの要約統計量 | ★★★★★ | df.describe() | DataFrame |
シリーズの要約統計量 | ★★★★☆ | df['列名'].describe() | Series |
シリーズのデータ数 | ★★★★☆ | df['列名'].size | int |
シリーズの有効データ数 | ★★★★★ | df['列名'].count() | int |
シリーズの有効データの固有値の数 | ★★★☆☆ | df['列名'].nunique() | int |
シリーズの有効データの合計値 | ★★★★★ | df['列名'].sum() | float |
シリーズの有効データの平均値 | ★★★★★ | df['列名'].mean() | float |
シリーズの有効データの中央値 | ★★★★☆ | df['列名'].median() | float |
シリーズの有効データの最頻値 | ★★☆☆☆ | df['列名'].mode() | Series |
シリーズの有効データの最小値 | ★★★★★ | df['列名'].min() | float |
シリーズの有効データの最大値 | ★★★★★ | df['列名'].max() | float |
シリーズの有効データの第1四分位数 | ★★★★★ | df['列名'].quantile(0.25) | float |
シリーズの有効データの第3四分位数 | ★★★★★ | df['列名'].quantile(0.75) | float |
シリーズの有効データの不偏歪度 | ★★☆☆☆ | df['列名'].skew() | float |
シリーズの有効データの不偏尖度 | ★★☆☆☆ | df['列名'].kurt() | float |
シリーズの有効データの不偏標準偏差 | ★★★★★ | df['列名'].std() | float |
シリーズの有効データの母標準偏差 | ★★★★☆ | df['列名'].std(ddof=0) | float |
シリーズの有効データの不偏標準誤差 | ★★★☆☆ | df['列名'].sem() | float |
シリーズの有効データの母標準誤差 | ★★☆☆☆ | df['列名'].sem(ddof=0) | float |
データフレームの要約統計量
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
データフレームの要約統計量
df.describe()
# height weight
# count 18.000000 17.000000
# mean 174.111111 74.411765
# std 4.457497 4.000919
# min 166.000000 67.000000
# 25% 170.500000 73.000000
# 50% 173.500000 74.000000
# 75% 177.000000 76.000000
# max 182.000000 82.000000
シリーズの要約統計量
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの要約統計量
df['height'].describe()
# count 18.000000
# mean 174.111111
# std 4.457497
# min 166.000000
# 25% 170.500000
# 50% 173.500000
# 75% 177.000000
# max 182.000000
# Name: height, dtype: float64
シリーズのデータ数
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズのデータ数
df['height'].size
# 20
シリーズの有効データ数
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データ数
df['height'].count()
# 18
シリーズの有効データの固有値の数
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの固有値の数
df['height'].nunique()
# 11
シリーズの有効データの合計値
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの合計値
df['height'].sum()
# 3134.0
シリーズの有効データの平均値
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの平均値
df['height'].mean()
# 174.11111111111111
シリーズの有効データの中央値
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの中央値
df['height'].median()
# 173.5
シリーズの有効データの最頻値
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの最頻値
df['height'].mode().to_list()
# [170.0, 173.0]
シリーズの有効データの最小値
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの最小値
df['height'].min()
# 166.0
シリーズの有効データの最大値
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの最大値
df['height'].max()
# 182.0
シリーズの有効データの第1四分位数
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの第1四分位数
df['height'].quantile(0.25)
# 170.5
シリーズの有効データの第3四分位数
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの第3四分位数
df['height'].quantile(0.75)
# 177.0
シリーズの有効データの不偏歪度
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの不偏歪度
df['height'].skew()
# 0.12805525139362886
シリーズの有効データの不偏尖度
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの不偏尖度
df['height'].kurt()
# -0.4359430509868423
シリーズの有効データの不偏標準偏差
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの不偏標準偏差
df['height'].std()
# 4.457497172825984
シリーズの有効データの母標準偏差
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの母標準偏差
df['height'].std(ddof=0)
# 4.331908597692873
シリーズの有効データの不偏標準誤差
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの不偏標準誤差
df['height'].sem()
# 1.050642159341706
シリーズの有効データの母標準誤差
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'height': heights, 'weight': weights})
print(df)
# name height weight
# 0 Noah 170.0 74.0
# 1 Liam 174.0 68.0
# 2 Elijah 178.0 74.0
# 3 Oliver 182.0 79.0
# 4 James 182.0 69.0
# 5 Mason 173.0 82.0
# 6 Logan 170.0 NaN
# 7 Lucas 177.0 67.0
# 8 Mateo 175.0 72.0
# 9 Ethan 172.0 78.0
# 10 Jacob NaN 74.0
# 11 Anthony 170.0 76.0
# 12 Joseph 168.0 76.0
# 13 Luke 166.0 75.0
# 14 Isaiah 178.0 73.0
# 15 Nicholas 173.0 NaN
# 16 Aaron 177.0 NaN
# 17 Connor NaN 79.0
# 18 Jose 176.0 73.0
# 19 Adam 173.0 76.0
シリーズの有効データの母標準誤差
df['height'].sem(ddof=0)
# 1.0210406483029797
グループ集計
基本
df.groupby(by=[列名のリスト], as_index=False).agg({'列名': [集約関数のリスト]の辞書})
# Return:
# DataFrame
サンプルプログラムを表示する。
逆引き | 使用頻度 | agg関数で使える集約関数 |
---|---|---|
データ数 | ★★★★☆ | 'size' |
有効データ数 | ★★★★★ | 'count' |
有効データの固有値の数 | ★★★☆☆ | 'nunique' |
有効データの合計値 | ★★★★★ | 'sum' |
有効データの平均値 | ★★★★★ | 'mean' |
有効データの中央値 | ★★★★☆ | 'median' |
有効データの最頻値 | ★★☆☆☆ | lambda n: n.mode().to_list() |
有効データの最小値 | ★★★★★ | 'min' |
有効データの最大値 | ★★★★★ | 'max' |
有効データの第1四分位数 | ★★★★★ | lambda n: n.quantile(0.25) |
有効データの第3四分位数 | ★★★★★ | lambda n: n.quantile(0.75) |
有効データの不偏歪度 | ★★☆☆☆ | 'skew' |
有効データの不偏尖度 | ★★☆☆☆ | pd.Series.kurt |
有効データの不偏標準偏差 | ★★★★★ | 'std' |
有効データの母標準偏差 | ★★★★☆ | lambda n: n.std(ddof=0) |
有効データの不偏標準誤差 | ★★★☆☆ | 'sem' |
有効データの母標準誤差 | ★★☆☆☆ | lambda n: n.sem(ddof=0) |
グループ集計
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 血液型
d = {1: 'A', 2: 'B', 3: 'O', 4: 'AB'}
bloods = [d.get(i) for i in np.random.randint(1, 5, len(names))]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.permutation(
np.hstack(
[np.random.randint(65, 85,
len(names) - 3),
np.full((3), np.nan)]))
# データフレームを作成
df = pd.DataFrame(data={'name': names, 'blood': bloods, 'height': heights, 'weight': weights})
print(df)
# name blood height weight
# 0 Noah AB 167.0 80.0
# 1 Liam B 183.0 75.0
# 2 Elijah AB 181.0 68.0
# 3 Oliver B 181.0 82.0
# 4 James AB NaN 76.0
# 5 Mason O 175.0 78.0
# 6 Logan B 179.0 71.0
# 7 Lucas AB 173.0 77.0
# 8 Mateo O 181.0 82.0
# 9 Ethan O 175.0 73.0
# 10 Jacob AB 170.0 68.0
# 11 Anthony O 183.0 79.0
# 12 Joseph AB 180.0 77.0
# 13 Luke A 169.0 67.0
# 14 Isaiah AB 184.0 66.0
# 15 Nicholas AB 175.0 NaN
# 16 Aaron B 167.0 NaN
# 17 Connor O 172.0 66.0
# 18 Jose O NaN NaN
# 19 Adam A 181.0 80.0
グループ集計
df.groupby(by=['blood'], as_index=False).agg({
'height': ['mean', 'count'],
'weight': ['mean', 'count']
})
# blood height weight
# mean count mean count
# 0 A 175.000000 2 73.500000 2
# 1 AB 175.714286 7 73.142857 7
# 2 B 177.500000 4 76.000000 3
# 3 O 177.200000 5 75.600000 5
グループ集計(マルチインデックスを解除)
# 集約する
df_groupby = df.groupby(by=['blood'], as_index=False).agg({
'height': ['mean', 'count'],
'weight': ['mean', 'count']
})
# 列のマルチインデックスを解除する
df_groupby.columns = [f'{x}_{y}' if y!='' else f'{x}' for x, y in df_groupby.columns]
print(df_groupby)
# blood height_mean height_count weight_mean weight_count
# 0 A 175.000000 3 80.5 2
# 1 AB 170.333333 3 77.0 4
# 2 B 176.250000 8 76.0 7
# 3 O 176.500000 4 82.0 4
ピボットテーブル
基本
df.pivot_table(
values=[集計する列名のリスト],
index=[行方向にグルーピングする列名のリスト],
columns=[列方向にグルーピングする列名のリスト],
aggfunc=[集約関数リスト],
# fill_value=0, # 集計後の欠損値を指定した値で穴埋め
# margins=True, # カテゴリごとの小計・総計を算出
# margins_name='All', # 小計・総計のラベル名を変更
)
# Return:
# Excelのピボットテーブル形式のDataFrame
サンプルプログラムを表示する。
逆引き | 使用頻度 | aggfuncパラメータで使える集約関数 |
---|---|---|
データ数 | ★★★★☆ | 'size' |
有効データ数 | ★★★★★ | 'count' |
有効データの固有値の数 | ★★★☆☆ | 'nunique' |
有効データの合計値 | ★★★★★ | 'sum' |
有効データの平均値 | ★★★★★ | 'mean' |
有効データの中央値 | ★★★★☆ | 'median' |
有効データの最頻値 | ★★☆☆☆ | lambda n: n.mode().to_list() |
有効データの最小値 | ★★★★★ | 'min' |
有効データの最大値 | ★★★★★ | 'max' |
有効データの第1四分位数 | ★★★★★ | lambda n: n.quantile(0.25) |
有効データの第3四分位数 | ★★★★★ | lambda n: n.quantile(0.75) |
有効データの不偏歪度 | ★★☆☆☆ | 'skew' |
有効データの不偏尖度 | ★★☆☆☆ | pd.Series.kurt |
有効データの不偏標準偏差 | ★★★★★ | 'std' |
有効データの母標準偏差 | ★★★★☆ | lambda n: n.std(ddof=0) |
有効データの不偏標準誤差 | ★★★☆☆ | 'sem' |
有効データの母標準誤差 | ★★☆☆☆ | lambda n: n.sem(ddof=0) |
ダイナミッククロス集計
サンプルデータ
import numpy as np
import pandas as pd
# 名前
names = [
'Noah', 'Liam', 'Elijah', 'Oliver', 'James', 'Mason', 'Logan', 'Lucas',
'Mateo', 'Ethan', 'Jacob', 'Anthony', 'Joseph', 'Luke', 'Isaiah',
'Nicholas', 'Aaron', 'Connor', 'Jose', 'Adam'
]
# 出身地
d = {1: 'US', 2: 'UK'}
countries = [d.get(i) for i in np.random.randint(1, 3, len(names))]
# 血液型
d = {1: 'A', 2: 'B', 3: 'O', 4: 'AB'}
bloods = [d.get(i) for i in np.random.randint(1, 5, len(names))]
# 身長データ
heights = np.random.permutation(
np.hstack(
[np.random.randint(165, 185,
len(names) - 2),
np.full((2), np.nan)]))
# 体重データ
weights = np.random.randint(65, 85, len(names))
# データフレームを作成
df = pd.DataFrame(
data={
'name': names,
'country': countries,
'blood': bloods,
'height': heights,
'weight': weights
})
print(df)
# name country blood height weight
# 0 Noah UK AB NaN 76
# 1 Liam UK O 184.0 67
# 2 Elijah US O 184.0 84
# 3 Oliver UK B NaN 68
# 4 James UK A 179.0 69
# 5 Mason US O 178.0 67
# 6 Logan US B 181.0 65
# 7 Lucas UK O 166.0 66
# 8 Mateo US B 179.0 71
# 9 Ethan UK AB 181.0 78
# 10 Jacob UK B 170.0 76
# 11 Anthony UK AB 170.0 77
# 12 Joseph US O 170.0 72
# 13 Luke US A 179.0 78
# 14 Isaiah UK B 184.0 72
# 15 Nicholas US O 182.0 81
# 16 Aaron US O 182.0 78
# 17 Connor US A 168.0 68
# 18 Jose US B 176.0 69
# 19 Adam UK B 184.0 70
ダイナミッククロス集計
df.pivot_table(values='height',
index='blood',
columns='country',
aggfunc=['count', 'mean'])
# count mean
# country UK US UK US
# blood
# A 1.0 2.0 179.000000 173.500000
# AB 2.0 NaN 175.500000 NaN
# B 3.0 3.0 179.333333 178.666667
# O 2.0 5.0 175.000000 179.200000