pandasの最初の一歩|文系がつまずく5つのポイントと対処法
pandasは、Pythonでデータ分析をするなら避けて通れないライブラリです。 一方で、文系がPythonの学習で最初に本格的につまずくのもこのpandasです。 この記事では、初心者が必ずと言っていいほど引っかかる5つのポイントを、対処法とあわせて先回りで潰しておきます。
環境はインストール不要のGoogle Colabを前提にします。
Colabにはpandasが最初から入っているので、import pandas as pd だけで使い始められます。
つまずき1:DataFrameとSeriesの違いがわからない
pandasには、よく似た2つの入れ物があります。
- DataFrame:表全体(Excelのシート1枚に相当)
- Series:1列分のデータ(Excelの1列に相当)
DataFrameから1列を取り出すとSeriesになる、という関係です。
import pandas as pd
df = pd.read_csv("data.csv") # これはDataFrame(表全体)
uriage = df["売上"] # これはSeries(1列)
最初は「表がDataFrame、1列がSeries」とだけ覚えれば足ります。 エラーメッセージにこの2つの単語が出てきたとき、自分が今どちらを触っているかを意識するだけで、原因が見えやすくなります。
つまずき2:行を選ぶのか列を選ぶのかで書き方が違う
pandasでは、列を選ぶときと行を選ぶときで書き方が変わります。 ここが初心者の混乱の最大の原因です。
df["売上"] # 列を選ぶ(列名を指定)
df[df["売上"] > 100] # 行を選ぶ(条件を指定)
列は名前で、行は条件で選ぶ、と役割で覚えると整理できます。
「特定の行の特定の列」をピンポイントで指定したいときは df.loc[行の条件, 列名] を使いますが、これは上の2つに慣れてからで構いません。
つまずき3:日本語の列名でエラーが出る
実務のデータは列名が日本語のことが多く、これがトラブルの元になります。
特に、列名の前後に気づかない空白が入っていると、df["売上"] としても「そんな列はない」というエラーになります。
対処は、まず列名を確認することです。
print(df.columns) # 実際の列名を一覧表示する
表示された列名をそのままコピーして使えば、空白や全角半角の違いによるミスを避けられます。 「列がないと言われたら、まずcolumnsを見る」を癖にしてください。
つまずき4:SettingWithCopyWarningという警告が出る
データの一部を書き換えようとすると、SettingWithCopyWarning という警告が出ることがあります。
エラーで止まるわけではないので無視しがちですが、意図せず元データが書き換わらない原因になります。
これは「表の一部のコピーを触っているのか、元の表そのものを触っているのか」が曖昧なときに出る警告です。
初心者のうちは、値を書き換えるときに .loc を使うと回避できます。
# 警告が出やすい書き方
df[df["売上"] > 100]["ランク"] = "A"
# .loc を使う書き方
df.loc[df["売上"] > 100, "ランク"] = "A"
理屈を完全に理解するのは後回しでよいので、まず「書き換えるときは .loc」と手順で覚えておくと安全です。
つまずき5:欠損値(NaN)の扱いに戸惑う
実務のデータには、空欄がつきものです。
pandasは空欄を NaN(Not a Number)として読み込みます。
NaNが含まれると、合計や平均が意図しない結果になったり、条件で絞るときに引っかかったりします。 まずは、どこにいくつ欠損があるかを確認する習慣をつけてください。
print(df.isna().sum()) # 列ごとの欠損の数を表示する
そのうえで、欠損をどう扱うか(行ごと除く、0で埋める、平均で埋める、など)を分析の目的に応じて選びます。 「欠損はまず数える、処理は目的次第」という順序を覚えておけば、判断に迷いにくくなります。
つまずいたときの共通の構え
5つのポイントに共通するのは、「エラーや警告が出たら、まず今のデータの状態を確認する」という構えです。
- 列名がわからない →
df.columns - データの中身を見たい →
df.head() - 欠損を知りたい →
df.isna().sum()
書いたコードをにらんで悩むより、データの現状を表示させたほうが原因に早くたどり着けます。 これはExcelでセルを目視で確認するのと同じ動作を、コードでやっているだけです。
まとめ
- DataFrame(表全体)とSeries(1列)の違いをまず押さえる
- 列は名前で、行は条件で選ぶ。ピンポイント指定は .loc
- 「列がない」と言われたら
df.columns、書き換えは.loc、欠損はdf.isna().sum()で数える - 困ったらコードをにらむ前にデータの状態を表示する。学習全体の流れはPython独学ロードマップを参照