はじめに
(統計的な操作に便利と聞いて)大量のCSVファイルを統計的に扱う必要がありSeriesオブジェクトを使うことにしました。
そしてPandasのSeriesオブジェクトを使っているときにエラーに遭遇。
PandasのSeriesは便利ですが、使いはじめはよく分からない事があったので、今回はそのときに遭遇したエラーと対処方法についてのメモです。
エラーの原因と対処法
エラー
まず発生したエラーですが、
ValueError: Can only compare identically-labeled Series objects
というものでした。
エラーの日本語訳は、
「同一のラベルを持つSeriesオブジェクト同士しか比較できません」
という意味になります。
これだけではよく分からないと思います(僕は最初はわかりませんでした)
まずSeriesオブジェクトについて少し補足します。
PandasのSeriesオブジェクト
PandasのSeriesオブジェクトとは
PandasのSeriesオブジェクトは、一次元の配列のようなデータ構造で、インデックスによりデータにラベルが付けられます。このインデックスによるラベリングは、Pandasの特徴的な機能であり、任意のデータ型(整数、文字列、浮動小数点数、Pythonオブジェクトなど)を扱うことができます。
例えば、以下のようにリストからSeriesを生成することができます。
import pandas as pd
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
また辞書から生成したりも可能です。
import pandas as pd
s = pd.Series({'a': 1, 'b': 3, 'c': 5})
print(s)
利用用途
で、これを使って何が良いの?と思うところだと思います。
PandasのSeriesオブジェクトは、以下のようなシチュエーションで非常に役立ちます。
- 単一の列データを操作する際: Seriesオブジェクトは一次元のデータ構造であるため、単一の列データを操作する場合に非常に有用です。各列はそれぞれのデータ型を保持することができます。
- インデックスに基づくデータ操作: Seriesオブジェクトはインデックス付きのデータを操作する際に特に便利です。例えば、特定の日付や時間帯に関連するデータを取り扱うときや、特定の条件に基づいてデータを選択するときなどです。
- ベクトル化された操作: Pandasはデータをベクトル化して操作するため、ループを使用するよりも高速に処理を行うことができます。Seriesオブジェクトを使用すると、これらのベクトル化された操作を簡単に行うことができます。
- 欠損値の取り扱い: Seriesオブジェクトは、欠損値(NaN)を自動的に扱うことができます。欠損値のあるデータを集計や統計計算に使用するときに、自動的に欠損値を無視するため、データ前処理における欠損値の取り扱いを簡単にします。
- 統計的な操作: 平均、中央値、最小値、最大値などの統計的な計算を行うためのメソッドが豊富に用意されています。このため、データ解析において頻繁に使用されます。
これらがPandasのSeriesがデータ分析やデータクレンジング、機械学習の前処理など、さまざまなタスクで重宝される理由のようです。
エラーの原因
PandasのSeriesオブジェクトについて簡単ですが説明が済んだので、次に、今回のエラーについてです。
今回のエラーの原因はSeriesオブジェクトのインデックスが一致しなかったからです。
具体的に簡単なソースコードの例を見てみます。
エラーが発生するソースコードの例
簡単な例ですが2つのSeriesを比べるサンプルソースです。
import pandas as pd
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([1, 2, 3], index=['a', 'c', 'b'])
# 2つのSeriesを比べる
print(s1 == s2) # ここで「ValueError: Can only compare identically-labeled Series objects」が発生
これを実行すると7行目で「ValueError: Can only compare identically-labeled Series objects」が発生します。
エラーを修正したソースコードの例
次はエラーの箇所を修正したものです。
修正内容はシンプルでindexの名称を揃えます。
import pandas as pd
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
# Compare two series
print(s1 == s2)
これを実行すると
a True
b True
c True
dtype: bool
となります。
さいごに
今回はPandasのSeriesを使った例でした。
機械学習やAIを使う人はこのSeriesは非常に便利だと思います。
他にはビッグデータを扱う場合なんかも重宝するのではないかと思います。
僕自身も少しデータの解析をする必要があり今回使いました。
使い始めというのは分からない事が多いので、備忘録ですがこうしてメモに残しました。
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。