はじめに
無料で使えるPythonのデータ解析ライブラリ 「pandas」のデータ型について解説します。
pandas では以下2つのデータ型がよく使われます。
名前 | 機能 |
---|---|
Series | 配列のようなデータ形式です。表の縦・横の一方向(一次元)に対応します |
DataFrame | 表のようなデータ形式です。表の縦・横両方(二次元)に対応します |
DataFrame
極簡単に言ってしまうと「Series」が集まったデータ型です。表などの二次元のデータを扱いやすくする機能を搭載しています。
Series
DataFrameのベースとなるデータ型です。行などの、一次元のデータを扱いやすくする機能を搭載しています。
今回の記事の内容
今回は上記pandasの2つのデータ型の内、ベースとなる「Series」について紹介します。Pythonやpandasの初心者の方でもなるべく分かりやすいように、シンプルなコードで解説します。
DataFrameの使い方については以下の記事をご覧ください。
環境
この記事は以下の環境で作成しています。
環境 | バージョンなど |
Python | 3.9.6 |
pandas | 4.7.2 |
OS | Wiindows10 |
「Windows10 + Python + pandas + venv」の環境で作成しています。(AnacondaやJupiterNotebookは使用していません)
「環境やインストール方法が知りたい」という方は、以下の記事をご覧ください。
Seriesの使い方
Seriesについての解説内容は以下の通りです (クリックで各項目に移動できます)。
Seriesの作成・名前を付ける
Seriesの操作
Seriesの結合・配列/辞書を作る
Seriesの機能は非常に多く、ここですべての機能は紹介しきれません。他の機能が気になる方は、是非公式ドキュメントも参照してみてください。
Seriesの作成・名前をつける
配列から作成
配列から作成するには、作成した配列をpandasのSeries関数(コンストラクタ)に渡します。
Seriesでは、要素(インデックス)に名前を付けることができますが、配列には要素名がありません。そのため0からの連番が自動的に設定されます。
import pandas as pd
# 配列からSeriesを作成します
list = [1,2,3]
series_list = pd.Series(list)
print(series_list)
"""
# 実行結果:
0 10
1 11
2 12
dtype: int64
"""
辞書(Dictionary)から作成
辞書から作成するには、作成した辞書をpandasのSeries関数(コンストラクタ)に渡します。
下記の”Zero”などの辞書の要素名は、Seriesの要素名としてそのまま引き継がれます。
import pandas as pd
# 辞書(Dictionary)からSeriesを作成します
dict = { "Zero":10, "First":11, "Second":12 }
series_dict = pd.Series(dict)
print(series_dict)
"""
# 実行結果:
Zero 10
First 11
Second 12
dtype: int64
"""
要素(index)に名前を付ける
要素に名前を付けるには、index関数を使用します。
前述の配列からSeriesを作成した場合など、要素名を別途設定する場合に使用します。
import pandas as pd
# 配列からSeriesを作成します
list = [10,11,12]
series_list = pd.Series(list)
# 要素名を追加します
series_list.index = ["Zero","First","Second"]
print(series_list)
"""
# 実行結果:
Zero 10
First 11
Second 12
dtype: int64
"""
Seriesに名前を付ける
nameプロパティを使って、Series自体にも名前を付けることができます。
(DataFrameを含めて使用する際に、便利になる機能です)
import pandas as pd
# 配列からSeriesを作成します
list = [10,11,12]
series_list = pd.Series(list)
# Seriesに名前を付けます
series_list.name = "Series from list"
print(series_list)
"""
# 実行結果:
Zero 10
First 11
Second 12
Name: Series from list, dtype: int64 <-- Name が設定されます
"""
Seriesの操作
要素の取得・変更・追加などの、Seriesの操作方法は以下の通りです。
データの取得
データの取得には、要素の番号・名称を指定します。
要素名(番号)を直接指定するか、「at・iat・loc・iloc」プロパティを使用します。
「at・iat・loc・iloc」は要素名称(番号)で、Seriesのデータへアクセスするプロパティです、[]で指定します。 「iあり」は番号、「iなし」は名称指定に使用します。
プロパティの説明や効能などはやや難しくなるので、ここでは「データへアクセスするための、特別な変数のようなもの」として見てください。
import pandas as pd
# Seriesを作成します
# 配列、要素名を直接Series関数に渡して作成しています
series = pd.Series([10,11,12], index=["Zero","First","Second"])
# 番号を直接指定して取得
value0 = series[0]
print(value0)
# 名称を直接指定して取得
value1st = series["First"]
print(value1st)
# atで取得
valueAt = series.at["Second"]
print(valueAt)
# iatで取得
valueIAt = series.iat[0]
print(valueIAt)
"""
# 実行結果:
10
11
12
10
"""
※ loc, ilocも使い方は同じです。
データの変更
データの変更には、要素の番号・名称を指定します。
直接指定するか「at・iat・loc・iloc」を使用します。
import pandas as pd
# Seriesを作成します
# 配列、要素名を直接Series関数に渡して作成しています
series = pd.Series([10,11,12], index=["Zero","First","Second"])
# 番号で指定して変更
series[0] = 100
print(series[0])
# 名称で指定して変更
series["First"] = 101
print(series["First"])
# atで指定して変更
series.at["Second"] = 102
print(series.at["Second"])
# iatで指定して変更
series.iat[0] = 1000
print(series.iat[0])
"""
# 実行結果:
100
101
102
1000
"""
要素の追加
新しい要素名称(番号)にデータを代入します。
”番号”で指定する場合「at/loc」を使用してください。「直接指定 / iat / iloc」を使うと、存在しない要素へのアクセスとしてエラーになります。
import pandas as pd
# Seriesを作成します
# 配列、要素名を直接Series関数に渡して作成しています
series = pd.Series([10,11,12], index=["Zero","First","Second"])
# at(番号)で追加
series.at = 13
# NG:以下の方法では追加できない
# series = 13
# series.iat = 13
# series.iloc = 13
# 名称で追加
series["Fourth"] = 14
# atで追加
series.at["Fifth"] = 15
print(series)
"""
# 実行結果:
Zero 10
First 11
Second 12
3 13
Fourth 14
Fifth 15
dtype: int64
"""
要素の抽出
スライス(:)を使って、名称・番号を「始点:終点」の形で範囲指定します。抽出したデータもSeries型として返されます。
番号を使った場合のみ、スライスの終点より「ひとつ少ない番号」までが取得されので注意してください。以下のコードは、すべて同じ範囲を抽出するコードです。
import pandas as pd
# Seriesを作成します
# 配列、要素名を直接Series関数に渡して作成しています
series = pd.Series([10,11,12], index=["Zero","First","Second"])
# 名称を指定(直接指定・loc)
part_name = series["Zero":"Second"]
part_name_loc = series.loc["Zero":"Second"]
# 番号を指定(直接指定・iloc)
part_no = series[0:3]
part_no_iloc = series.iloc[0:3]
# 抽出結果の表示
print(part_name)
print(part_name_loc)
print(part_no)
print(part_no_iloc)
"""
# 実行結果:
# 同じ内容が4つ表示される
Zero 10
First 11
Second 12
dtype: int64
"""
要素の削除
削除には「drop関数」を使います。削除したい要素を「名称・番号」で指定します。
要素が削除されたSeriesは関数の「戻り値」として返されます。drop関数を呼び出すだけでは要素は変更されません。
drop関数を呼び出したSeriesを変更するには、以下のように、戻り値を代入するように記述します。
import pandas as pd
# Seriesを作成します
# 配列、要素名を直接Series関数に渡して作成しています
list = [10,11,12]
series = pd.Series([10,11,12], index=["Zero","First",2])
# 番号で削除
series = series.drop(2)
# 名称で削除
series = series.drop("First")
print(series)
"""
# 実行結果:
Zero 10
dtype: int64
"""
Seriesの結合
「Series同士」を結合するにはappend関数を使います。
append関数も呼び出すだけではSeriesに何も影響を与えません。結合されたSeriesは関数の戻り値で返されます。
append関数を呼び出したSeriesを変更するには、 以下のように、戻り値を代入するように記述します。
import pandas as pd
# Seriesを作成します
# 配列、要素名を直接Series関数に渡して作成しています
series1 = pd.Series([10,11,12], index=["Zero", "First","Second"])
series2 = pd.Series([20,21,22], index=["Third","Fourth","Fifth"])
series1 = series1.append(series2)
print(series1)
"""
# 実行結果:
Zero 10
First 11
Second 12
Third 20
Fourth 21
Fifth 22
dtype: int64
"""
Seriesから配列・辞書を作る
配列を作成する場合は「to_list関数」、辞書を作成する場合は「to_dict関数」を使用します。
import pandas as pd
# Seriesを作成します
# 配列、要素名を直接Series関数に渡して作成しています
series = pd.Series([10,11,12], index=["Zero","First","Second"])
list = []
dict = {}
# Seriesから配列を作成
list = series.tolist()
# Seriesから辞書を作成
dict = series.to_dict()
print(list)
print(dict)
"""
# 実行結果:
[10, 11, 12]
{'Zero': 10, 'First': 11, 'Second': 12}
"""
まとめ
無料で使えるPythonのデータ解析ライブラリ 「pandas」でよく使われるデータ型の内、Seriesの使い方について解説しました。参考になればうれしいです。
お知らせ
3月号の『日経ソフトウェア』はPythonの特集。穴埋め式クイズで学ぶPython入門や、PythonでExcelを動かす方法などが特集されています。
もう一つのデータ形式 DataFrame
この記事では「Series」について解説しましたが、pandasでは「DataFrame」というデータ形式も頻繁に使われます。「DataFrame」については以下の記事をご覧ください。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。