Excel表と相性抜群なDataFrameを理解しよう
まず、Excelの表をpandasのDataFrameとして読み込み、列名や並びを操作するところまでを確認していきます。
DataFrameとは、pandasが扱う表形式のデータ構造です。Excelで言う「表(見出し付きの矩形範囲)」とよく似ており、xl()で取り込んだデータがそのままDataFrameになると捉えれば、以降のクレンジングや集計は、すべて「DataFrameに対する操作」として説明できます。
分析チーム向けの売上スナップショットを想定し、次の表をシートの左上(例:A1:D7)に入力してください。1行目が見出し、2行目以降がデータです。前処理に入る前の準備段階として、ここでは表記ゆれや欠損のない「きれいな表」を使います。
| 商品カテゴリ | 地域 | 売上 | 数量 |
| スキンケア | 東日本 | 120000 | 45 |
| メイク | 西日本 | 98000 | 38 |
| スキンケア | 西日本 | 85000 | 29 |
| ヘアケア | 東日本 | 64000 | 22 |
| メイク | 東日本 | 210000 | 102 |
| ヘアケア | 西日本 | 53000 | 18 |
行ラベル(インデックス)と列名(カラム)
空いているセル(例:F2)を選び、=PY(と入力してPythonセルを開始します。範囲A1:D7は、ご自身の表の位置に合わせて読み替えてください。
df = xl("A1:D7", headers=True)
df
Ctrl+Enterで確定すると、Pythonセルには[PY] DataFrameのようにオブジェクトとして結果が格納されます。セルを選ぶとプレビューは表示されますが、セル幅の都合で文字が見切れて読みにくいことがあります。
中身を表形式でしっかり確認するには、セル横の挿入データアイコン(緑の+付きボタン)をクリックし、メニューの「フィールド」から「arrayPreview」を選びます。インデックス(行ラベル)付きの表としてシートに展開され、元のExcel表に近い見た目で確認できます。
DataFrameには、行方向のインデックス(行ラベル)とカラム(列名)があります。左端に並ぶ0,1,2,…がインデックス、見出しの商品カテゴリ・地域・売上・数量がカラムです。
Excelで言えば、それぞれ左端の「行番号」と1行目の「見出し」に当たります。カラム一覧はdf.columns、インデックスはdf.indexで確認できます。どちらも後から変更・並べ替えができるため、groupbyやmergeで「どの列をキーにするか」を考えるときの土台になります。
左端の0,1,2,…はプレビュー上の行ラベル(インデックス)であり、データ列ではありません。第1回で触れた「Excelの値」としてシートにスピルする場合、こうした既定の数値インデックスは通常セル値には出力されません。
一方、後述のgroupbyのようにインデックスが「東日本」のような文字列になる場合は、行見出しとして展開されることがあります。
特定の列を抜き出すときは、セルを1つずつ指定するのではなく**列名でまとまりを指定**します。複数列はリストで渡します。
df[["商品カテゴリ", "売上"]]
このように、必要な列だけを名前で取り出せます。集計や結合の前に対象の列を絞り込む場面で役立ちます。
列名は後から変更できます。例えばシステム連携で英語名のまま取り込んだ表を、日本語の見出しにそろえたい――renameはそうした場面で使います。
df2 = df.rename(columns={"売上": "売上金額", "数量": "販売数量"})
df2
元のdfはそのまま残り、df2が新しい表になります(上書きしたい場合はdf = df.rename(...))。列名を統一しておくと、後続のgroupby・mergeでキーを指定する際に迷いません。
同じ要領で、df2[["地域", "商品カテゴリ", "売上金額", "販売数量"]]のように列順を並べ替えたり、df2.set_index("地域")でキー列を行ラベルに移したりもできます。
並べ替えにはsort_valuesを使います。売上金額の高い順に並べてみましょう。
df2.sort_values("売上金額", ascending=False)
ランキング形式のレポートを作るときに役立つ操作です。左端の行ラベルが4,0,1,…と元の番号を保ったまま、並びだけが変わっている点に注目してください。インデックスはもともとの「行の名前」であって、位置を指すわけではない点がExcelの行番号との違いです。
列単位での処理
Excelでは「1セルに数式を書いて、下方向にコピーする」のが基本動作でした。pandasでは、列まるごとに同じ計算を一括適用します。例えば税込売上の列を足すなら、次のコードで済みます。
df["税込売上"] = df["売上"] * 1.1 df[["商品カテゴリ", "売上", "税込売上"]]
Excelなら=C2*1.1を全行にコピーするところを、pandasはdf["売上"] * 1.1という1行で列全体に同じ計算を及ぼします。行数が数千・数万に増えても変わりません。同じ計算をコードブロックとして残せるため、「いつ・どの式で作った列か」を後から追える点も、実務での利点となります。
可読性
列単位の書き方には、コードが「何をしているか」を読み取りやすいという利点もあります。例えば「東日本で、かつ売上が10万円以上」はdf[(df["地域"] == "東日本") & (df["売上"] >= 100000)]のように、ほぼ日本語の条件文として書けます。
| 観点 | Excelの数式(セル参照の反復) | pandas(コード) |
| 条件抽出 | =IF(AND(B2="東日本",C2>=100000), …)を全行コピー |
df[(df["地域"]=="東日本") & (df["売上"]>=100000)]の1行 |
| 修正のしやすさ | しきい値変更時に全行の数式を修正、依存関係が追いづらい | 1か所(100000)を直すだけ、差分が一目 |
| 再利用 | ブックに依存し、手順が残りにくい | コードブロックとして保存・再実行で同じ結果 |
このように、「セルを1つずつ触る」から「読めるコードで処理する」への発想の切り替えが、pandasを使いこなす第一歩です。次節以降のクレンジングや集計も、この考え方を理解しておくと分かりやすくなります。
