データ型変換における問題と解決策
実務で以下のエラーに遭遇することがあります:
TypeError: unsupported operand type(s) for -: 'str' and 'float'
このエラーは文字列型と浮動小数点型の間で減算演算を実行しようとした際に発生します。
基本的な問題例
str_value = "5"
float_value = 3.14
result = str_value - float_value # 文字列と浮動小数点の減算は不可能
Seriesオブジェクトにおける型変換の問題
import pandas as pd
# 文字列を含むSeriesオブジェクトの作成
string_series = pd.Series(['1.2', '3.4', '5.6'])
# float型への直接変換は失敗する
try:
converted_series = float(string_series)
except TypeError as e:
print("エラー:", e)
適切な解決方法
import pandas as pd
string_series = pd.Series(['1.2', '3.4', '5.6'])
# pd.to_numeric()を使用した安全な変換
numeric_series = pd.to_numeric(string_series)
print("変換結果:", numeric_series)
print("データ型:", numeric_series.dtype)
Seriesオブジェクトの基本概念
PandasのSeriesは、インデックス付きの一次元配列として機能する基本データ構造です。様々なデータ型を格納でき、データ処理と分析を効率化する豊富なメソッドを提供します。
主要な機能
- 多様なデータ型の保存(整数、浮動小数点数、文字列、日付など)
- インデックス操作、スライス、フィルタリング、ソート、集計機能
- 演算時の自動的なデータアラインメント
- データ可視化のサポート
主要APIメソッドと使用例
| メソッド | 説明 |
|---|---|
| pd.Series(data, index) | Seriesオブジェクトの作成 |
| series.values | NumPy配列形式での値の取得 |
| series.index | インデックスの取得 |
| series.head(n) | 先頭n要素の取得 |
| series.tail(n) | 末尾n要素の取得 |
| series.astype(dtype) | データ型の変換 |
| series.isnull() | 欠損値のチェック |
| series.dropna() | 欠損値の削除 |
| series.fillna(value) | 欠損値の補完 |
| series.unique() | 一意の値の取得 |
| series.nunique() | 一意の値の数 |
| series.describe() | 記述統計の表示 |
| series.map(func) | 要素ごとの関数適用 |
実践的な使用例
import pandas as pd
# 様々なデータソースからのSeries作成
list_data = [10, 20, 30, 40, 50]
custom_index = ['X', 'Y', 'Z', 'W', 'V']
series_from_list = pd.Series(list_data, index=custom_index)
dict_data = {'X': 10, 'Y': 20, 'Z': 30, 'W': 40, 'V': 50}
series_from_dict = pd.Series(dict_data)
# 基本的な操作の実行
print("値の配列:", series_from_list.values)
print("インデックス:", series_from_list.index)
print("先頭3要素:", series_from_list.head(3))
print("浮動小数点変換:", series_from_list.astype(float))
実践デモ:学生成績管理
import pandas as pd
# 学生の成績データ
grade_data = {
'田中': 92,
'佐藤': 78,
'鈴木': 85,
'高橋': 67,
'伊藤': 90
}
grades = pd.Series(grade_data)
# 各種操作の実行
print("成績データ:\n", grades)
print("\n統計情報:\n", grades.describe())
print("\n80点以上の学生:\n", grades[grades >= 80])
# 成績の調整(5点加算)
def add_points(score):
return score + 5
adjusted_grades = grades.map(add_points)
print("\n調整後成績:\n", adjusted_grades)
スライス操作の例
import pandas as pd
sample_data = {'P': 15, 'Q': 25, 'R': 35, 'S': 45, 'T': 55}
sample_series = pd.Series(sample_data)
# インデックスによるスライス
sliced_data = sample_series['Q':'S']
print("スライス結果:\n", sliced_data)