Pandas 超入門2

本記事は Pandas 超入門1 の続きです。Colaboratory での実行を想定しています。 準備はこちらを参照ください。

Contents

テーブル操作

ここでは、テーブルデータから情報を得るために用いられる基本的な操作方法について一部を紹介します。

前準備としてアンスコムのデータを読み込んでおきます。

anscombe = pd.read_json('./sample_data/anscombe.json')

DataFrame の中身を確認する

アンスコムのデータをつかってDataFrameの確認・抽出を行います。

# typeの確認する
type(anscombe)
pandas.core.frame.DataFrame

pandas の DataFrame 型だということがわかりました。次にデータの冒頭だけを確認します。

# データの冒頭だけを確認する
anscombe.head()
  Series   X     Y
0      I  10  8.04
1      I   8  6.95
2      I  13  7.58
3      I   9  8.81
4      I  11  8.33

DataFrame のカラム名を確認します。

# DataFrameのカラム名を確認する
anscombe.columns
Index(['Series', 'X', 'Y'], dtype='object')

DataFrame の詳細については info 関数で確認することができます。

# DataFrameに関する情報を確認する
anscombe.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 44 entries, 0 to 43
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Series  44 non-null     object 
 1   X       44 non-null     int64  
 2   Y       44 non-null     float64
dtypes: float64(1), int64(1), object(1)
memory usage: 1.2+ KB

いままで見てきた通り、カラムは3種類あり、それぞれのデータ型も確認することができます。

DataFrame からカラム(列)を抽出する

# Seriesカラムを抽出する
anscombe['Series']
0       I
1       I
2       I
3       I
4       I
5       I
# 複数のカラムを指定して抽出する
anscombe[['Series', 'X']]
   Series   X
0       I  10
1       I   8
2       I  13
3       I   9
4       I  11
(以下省略)

DataFrame から行を抽出する

カラムの抽出ができたので、次は行の抽出方法を見てみましょう。行を抽出するにはilocを用いてインデックス番号を指定して抜き出す方法があります。一般的には以下のような書き方になります。

DataFrame.iloc[<インデックス番号>(,<カラム番号>)]
# インデックス番号を指定して抜き出す
anscombe.iloc[10]
Series       I
X            5
Y         5.68
Name: 10, dtype: object
# インデックス番号にスライスを渡すこともできます。
print(anscombe.iloc[0:6])
  Series   X     Y
0      I  10  8.04
1      I   8  6.95
2      I  13  7.58
3      I   9  8.81
4      I  11  8.33
5      I  14  9.96
# カラム番号も指定する
anscombe.iloc[0:6,2]
0    8.04
1    6.95
2    7.58
3    8.81
4    8.33
5    9.96
Name: Y, dtype: float64

インデックス番号を指定することで、DataFrameから行を抽出することができました。別の方法として、行数と同じ数の真偽値を与えることでもDataFrameから行を抽出することができます。

# anscombeの行数と同じ数の真偽値のリスト(bool_list)を作成する
row_cnt = len(anscombe)
bool_list = [x % 2 == 1 for x in range(row_cnt)] # インデックス番号が奇数であるものにTrue,偶数であるものにFalseを格納したリストを作成
bool_list
[False,
 True,
 False,
 True,
(途中省略)
 False,
 True,
 False,
 True]

この list をインデックス番号と同じように与えると True となっている行だけ(ここでは奇数の行だけ)を DataFrame から抽出してきます。

# bool_listを与えるとインデックス番号が奇数の行だけを抽出してくる
anscombe[bool_list]
	Series	X	Y
1	I	8	6.95
3	I	9	8.81
5	I	14	9.96
7	I	4	4.26
9	I	7	4.81
11	II	10	9.14
13	II	13	8.74
15	II	11	9.26
17	II	6	6.13
19	II	12	9.13
21	II	5	4.74
23	III	8	6.77
25	III	9	7.11
27	III	14	8.84
29	III	4	5.39
31	III	7	6.42
33	IV	8	6.58
35	IV	8	7.71
37	IV	8	8.47
39	IV	8	5.25
41	IV	8	5.56
43	IV	8	6.89

条件抽出

DataFrameに行数分の真偽値のリストやSeriesを渡すとTrueに該当する部分だけを抽出することができました。これを応用して、例えば、Seriesカラムの値がIに該当する行のみを抽出するというようなことができるようになります。

# anscombe['Series']=='I' によって真偽値のSeriesが作成され、それをDataFrameに渡している。
anscombe[anscombe['Series']=='I']

複数の抽出条件を課したい場合は次のように記述します。 条件を併記する際の論理演算子はpandasでは次の表のようになります。

pythonpandas
AND&
OR|
NOT~
anscombe[(anscombe['Series']=='I') & (anscombe['X'] >= 10)]
 Series	X	Y
0	I	10	8.04
2	I	13	7.58
4	I	11	8.33
5	I	14	9.96
8	I	12	10.84