[Python] Pandas – Seriesの使い方やDataFrameとの違いを解説
PandasのSeries
は、1次元のラベル付き配列で、インデックスと値のペアで構成されます。
Series
はリストや辞書のように扱え、インデックスを指定して要素にアクセスできます。
DataFrame
は2次元のデータ構造で、複数のSeries
が列として集まったものです。
Series
は1つのデータ型を持つのに対し、DataFrame
は各列が異なるデータ型を持つことができます。
Series
はDataFrame
の一部としても利用されます。
Pandasの基本構造:SeriesとDataFrameの概要
Pandasとは?
Pandasは、Pythonでデータ解析を行うための強力なライブラリです。
特に、表形式のデータを扱うためのデータ構造を提供しており、データの操作や分析を簡単に行うことができます。
Pandasは、データの読み込み、前処理、集計、可視化など、データサイエンスの多くのタスクに対応しています。
Seriesとは?
Seriesは、Pandasの基本的なデータ構造の一つで、1次元のラベル付き配列です。
数値や文字列などのデータを格納でき、各データにはインデックスが付与されます。
Seriesは、データの操作や分析を行う際に非常に便利です。
import pandas as pd
# Seriesの作成
data = [10, 20, 30, 40]
series = pd.Series(data)
print(series)
0 10
1 20
2 30
3 40
dtype: int64
DataFrameとは?
DataFrameは、Pandasのもう一つの主要なデータ構造で、2次元のラベル付きデータ構造です。
行と列から成り、異なるデータ型を持つことができます。
DataFrameは、データの集計やフィルタリング、結合などの操作を行う際に非常に強力です。
import pandas as pd
# DataFrameの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6]
}
df = pd.DataFrame(data)
print(df)
A B
0 1 4
1 2 5
2 3 6
SeriesとDataFrameの違い
特徴 | Series | DataFrame |
---|---|---|
次元 | 1次元 | 2次元 |
データ構造 | ラベル付き配列 | ラベル付きの行列 |
データ型 | 同じデータ型 | 異なるデータ型を持つことが可能 |
使用例 | 単一のデータ列の操作 | 複数のデータ列の操作 |
Seriesは主に単一のデータ列を扱うのに対し、DataFrameは複数のデータ列を持つため、より複雑なデータの操作が可能です。
Seriesの基本的な使い方
Seriesの作成方法
リストからSeriesを作成
リストを使用してSeriesを作成することができます。
リストの各要素がSeriesの値となり、デフォルトでインデックスは0から始まります。
import pandas as pd
# リストからSeriesを作成
data = [10, 20, 30, 40]
series_from_list = pd.Series(data)
print(series_from_list)
0 10
1 20
2 30
3 40
dtype: int64
辞書からSeriesを作成
辞書を使用してSeriesを作成することも可能です。
この場合、辞書のキーがインデックスとなり、値がSeriesの値になります。
import pandas as pd
# 辞書からSeriesを作成
data = {'a': 10, 'b': 20, 'c': 30}
series_from_dict = pd.Series(data)
print(series_from_dict)
a 10
b 20
c 30
dtype: int64
NumPy配列からSeriesを作成
NumPy配列を使用してSeriesを作成することもできます。
NumPy配列の各要素がSeriesの値となります。
import pandas as pd
import numpy as np
# NumPy配列からSeriesを作成
data = np.array([1, 2, 3, 4])
series_from_numpy = pd.Series(data)
print(series_from_numpy)
0 1
1 2
2 3
3 4
dtype: int64
インデックスの操作
インデックスの指定
Seriesを作成する際に、インデックスを指定することができます。
これにより、デフォルトのインデックスをカスタマイズできます。
import pandas as pd
# インデックスを指定してSeriesを作成
data = [10, 20, 30]
index = ['a', 'b', 'c']
series_with_index = pd.Series(data, index=index)
print(series_with_index)
a 10
b 20
c 30
dtype: int64
インデックスの変更
既存のSeriesのインデックスを変更することも可能です。
index
属性を使用して新しいインデックスを設定します。
import pandas as pd
# インデックスを変更
data = [10, 20, 30]
series = pd.Series(data)
# インデックスの変更
series.index = ['x', 'y', 'z']
print(series)
x 10
y 20
z 30
dtype: int64
インデックスのリセット
インデックスをリセットして、デフォルトの整数インデックスに戻すことができます。
import pandas as pd
# インデックスをリセット
data = [10, 20, 30]
index = ['a', 'b', 'c']
series = pd.Series(data, index=index)
# インデックスのリセット
series_reset = series.reset_index(drop=True)
print(series_reset)
0 10
1 20
2 30
dtype: int64
Seriesのデータアクセス
インデックスでのアクセス
インデックスを使用してSeriesの特定の要素にアクセスできます。
import pandas as pd
# インデックスでのアクセス
data = [10, 20, 30]
series = pd.Series(data)
# インデックス0の要素にアクセス
value = series[0]
print(value)
10
ラベルでのアクセス
ラベルを使用してSeriesの要素にアクセスすることもできます。
指定したラベルの値を取得します。
import pandas as pd
# ラベルでのアクセス
data = {'a': 10, 'b': 20, 'c': 30}
series = pd.Series(data)
# ラベル'b'の要素にアクセス
value = series['b']
print(value)
20
スライスによるアクセス
スライスを使用して、Seriesの複数の要素にアクセスすることができます。
import pandas as pd
# スライスによるアクセス
data = [10, 20, 30, 40, 50]
series = pd.Series(data)
# インデックス1から3までの要素にアクセス
sliced_series = series[1:4]
print(sliced_series)
1 20
2 30
3 40
dtype: int64
Seriesのデータ操作
データの追加
Seriesに新しいデータを追加することができます。
新しいインデックスを指定して値を追加します。
import pandas as pd
# データの追加
data = [10, 20, 30]
series = pd.Series(data)
# 新しいデータを追加
series[3] = 40
print(series)
0 10
1 20
2 30
3 40
dtype: int64
データの削除
Seriesから特定のデータを削除することができます。
dropメソッド
を使用します。
import pandas as pd
# データの削除
data = [10, 20, 30, 40]
series = pd.Series(data)
# インデックス1の要素を削除
series_dropped = series.drop(1)
print(series_dropped)
0 10
2 30
3 40
dtype: int64
データの更新
Seriesの特定の要素を更新することができます。
インデックスを指定して新しい値を代入します。
import pandas as pd
# データの更新
data = [10, 20, 30]
series = pd.Series(data)
# インデックス1の要素を更新
series[1] = 25
print(series)
0 10
1 25
2 30
dtype: int64
Seriesの応用的な使い方
Seriesの演算
数値演算
Seriesでは、数値演算を簡単に行うことができます。
各要素に対して演算を適用することができ、結果は新しいSeriesとして返されます。
import pandas as pd
# 数値演算
data = [10, 20, 30]
series = pd.Series(data)
# 各要素に10を加算
result = series + 10
print(result)
0 20
1 30
2 40
dtype: int64
ブール演算
Seriesに対してブール演算を行うことも可能です。
条件に基づいてTrueまたはFalseのSeriesを生成します。
import pandas as pd
# ブール演算
data = [10, 20, 30]
series = pd.Series(data)
# 各要素が15より大きいかどうかを確認
result = series > 15
print(result)
0 False
1 True
2 True
dtype: bool
欠損値の処理
欠損値の確認
Series内の欠損値を確認するには、isnullメソッド
を使用します。
欠損値がある場合はTrueが返されます。
import pandas as pd
import numpy as np
# 欠損値の確認
data = [10, np.nan, 30]
series = pd.Series(data)
# 欠損値の確認
missing_values = series.isnull()
print(missing_values)
0 False
1 True
2 False
dtype: bool
欠損値の補完
欠損値を補完するには、fillnaメソッド
を使用します。
指定した値で欠損値を埋めることができます。
import pandas as pd
import numpy as np
# 欠損値の補完
data = [10, np.nan, 30]
series = pd.Series(data)
# 欠損値を0で補完
filled_series = series.fillna(0)
print(filled_series)
0 10.0
1 0.0
2 30.0
dtype: float64
欠損値の削除
欠損値を削除するには、dropnaメソッド
を使用します。
欠損値を含む要素が削除されます。
import pandas as pd
import numpy as np
# 欠損値の削除
data = [10, np.nan, 30]
series = pd.Series(data)
# 欠損値を削除
cleaned_series = series.dropna()
print(cleaned_series)
0 10.0
2 30.0
dtype: float64
Seriesのフィルタリング
条件に基づくフィルタリング
条件を指定してSeriesをフィルタリングすることができます。
条件を満たす要素のみを抽出します。
import pandas as pd
# 条件に基づくフィルタリング
data = [10, 20, 30, 40]
series = pd.Series(data)
# 20以上の要素をフィルタリング
filtered_series = series[series >= 20]
print(filtered_series)
1 20
2 30
3 40
dtype: int64
複数条件でのフィルタリング
複数の条件を組み合わせてフィルタリングすることも可能です。
&
(AND)や|
(OR)を使用します。
import pandas as pd
# 複数条件でのフィルタリング
data = [10, 20, 30, 40]
series = pd.Series(data)
# 20以上かつ30未満の要素をフィルタリング
filtered_series = series[(series >= 20) & (series < 30)]
print(filtered_series)
1 20
dtype: int64
Seriesの統計的操作
基本統計量の取得
Seriesの基本的な統計量を取得するには、describeメソッド
を使用します。
平均、標準偏差、最小値、最大値などが得られます。
import pandas as pd
# 基本統計量の取得
data = [10, 20, 30, 40, 50]
series = pd.Series(data)
# 統計量の取得
stats = series.describe()
print(stats)
count 5.0
mean 30.0
std 15.811388
min 10.0
25% 20.0
50% 30.0
75% 40.0
max 50.0
dtype: float64
ユニーク値の確認
Series内のユニークな値を確認するには、uniqueメソッド
を使用します。
import pandas as pd
# ユニーク値の確認
data = [10, 20, 20, 30, 10]
series = pd.Series(data)
# ユニークな値を取得
unique_values = series.unique()
print(unique_values)
[10 20 30]
値のカウント
Series内の各値の出現回数をカウントするには、value_countsメソッド
を使用します。
import pandas as pd
# 値のカウント
data = [10, 20, 20, 30, 10]
series = pd.Series(data)
# 各値の出現回数をカウント
value_counts = series.value_counts()
print(value_counts)
10 2
20 2
30 1
dtype: int64
DataFrameとの連携
DataFrameからSeriesを抽出
DataFrameから特定の列を抽出することで、Seriesを取得することができます。
列名を指定することで、その列のデータをSeriesとして取り出せます。
import pandas as pd
# DataFrameの作成
data = {
'A': [1, 2, 3],
'B': [4, 5, 6]
}
df = pd.DataFrame(data)
# 列'A'をSeriesとして抽出
series_a = df['A']
print(series_a)
0 1
1 2
2 3
Name: A, dtype: int64
SeriesをDataFrameに変換
SeriesをDataFrameに変換するには、to_frameメソッド
を使用します。
これにより、Seriesが1列のDataFrameとして変換されます。
import pandas as pd
# Seriesの作成
data = [1, 2, 3]
series = pd.Series(data)
# SeriesをDataFrameに変換
df_from_series = series.to_frame(name='Values')
print(df_from_series)
Values
0 1
1 2
2 3
複数のSeriesをDataFrameに結合
複数のSeriesを結合して1つのDataFrameを作成することができます。
pd.concat
を使用して、Seriesを列として結合します。
import pandas as pd
# 複数のSeriesの作成
series_a = pd.Series([1, 2, 3])
series_b = pd.Series([4, 5, 6])
# SeriesをDataFrameに結合
df_combined = pd.concat([series_a, series_b], axis=1)
df_combined.columns = ['A', 'B']
print(df_combined)
A B
0 1 4
1 2 5
2 3 6
SeriesをDataFrameの列として追加
既存のDataFrameにSeriesを新しい列として追加することができます。
SeriesのインデックスがDataFrameのインデックスと一致している必要があります。
import pandas as pd
# DataFrameの作成
data = {
'A': [1, 2, 3]
}
df = pd.DataFrame(data)
# 新しいSeriesの作成
new_series = pd.Series([4, 5, 6])
# SeriesをDataFrameの列として追加
df['B'] = new_series
print(df)
A B
0 1 4
1 2 5
2 3 6
Seriesの実用例
時系列データの処理
Seriesは、時系列データの処理に非常に便利です。
Pandasでは、日付をインデックスとして使用することで、時系列データの操作が容易になります。
import pandas as pd
# 日付の範囲を作成
date_range = pd.date_range(start='2023-01-01', periods=5)
# 時系列データの作成
data = [100, 200, 300, 400, 500]
time_series = pd.Series(data, index=date_range)
print(time_series)
2023-01-01 100
2023-01-02 200
2023-01-03 300
2023-01-04 400
2023-01-05 500
Freq: D, dtype: int64
カテゴリデータの処理
Seriesを使用してカテゴリデータを処理することも可能です。
カテゴリデータは、特定のグループに分類されるデータを扱います。
import pandas as pd
# カテゴリデータの作成
data = ['A', 'B', 'A', 'C', 'B', 'A']
category_series = pd.Series(data, dtype='category')
# カテゴリの出現回数をカウント
category_counts = category_series.value_counts()
print(category_counts)
A 3
B 2
C 1
dtype: int64
テキストデータの処理
Seriesを使用してテキストデータを処理することもできます。
文字列操作を行うためのメソッドが豊富に用意されています。
import pandas as pd
# テキストデータの作成
data = ['apple', 'banana', 'cherry']
text_series = pd.Series(data)
# 各要素を大文字に変換
upper_series = text_series.str.upper()
print(upper_series)
0 APPLE
1 BANANA
2 CHERRY
dtype: object
数値データの集計
Seriesを使用して数値データの集計を行うことができます。
合計や平均などの統計量を簡単に計算できます。
import pandas as pd
# 数値データの作成
data = [10, 20, 30, 40, 50]
number_series = pd.Series(data)
# 合計と平均を計算
total = number_series.sum()
mean = number_series.mean()
print(f"合計: {total}, 平均: {mean}")
合計: 150, 平均: 30.0
まとめ
この記事では、PandasのSeriesの基本的な使い方から応用的な活用方法までを詳しく解説しました。
Seriesは、データ解析において非常に便利なデータ構造であり、特に1次元のデータを扱う際に役立ちます。
データの作成、インデックスの操作、演算、欠損値の処理、フィルタリング、統計的操作など、多岐にわたる機能を活用することで、データ分析の効率を高めることができます。
これを機に、実際のデータセットに対してSeriesを使ってみることで、データ解析のスキルをさらに向上させてみてください。
Pandasを活用することで、データの理解が深まり、より効果的な分析が可能になるでしょう。