Python3エンジニア認定データ分析試験 第4章 pandas 予想問題と解説
Python3エンジニア認定データ分析試験「第4章 pandas」の予想問題を15問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。出題は公式シラバスの範囲内です。
この章の要点
SeriesとDataFrameの基本、行・列の選択、欠損値と統計、結合とグループ化などを扱う分野です。全15問(基礎4問・標準11問)を収録しています。
- SeriesとDataFrameの基本
- 行・列の選択
- 欠損値と統計
- 結合とグループ化
情報源と編集区分
公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。
試験概要(公式)確認しておきたいポイント
当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。
- Series と DataFrame の次元の取り違え。Series は1次元のラベル付き配列、DataFrame は行と列を持つ2次元のデータ構造である。df['A'] のように単一のラベルを渡すと列が選ばれ、Series が返る。
- loc・iloc・at・iat の使い分け。loc と at はラベルで、iloc と iat は位置(整数)で指定する。iloc のスライスは終端を含まないので、6行4列の df.iloc[3:5, 0:2] は 2行2列になる。1つの値を速く取り出すには at か iat を使う。
- 真偽条件による選択の形の違い。df[df['A'] > 0] は A 列が条件を満たす行だけを残して行数が減るが、df[df > 0] は形が同じまま条件を満たさない要素が NaN になる。
- 欠損値を扱うメソッドの取り違え。dropna(how='any') は欠損を1つでも含む行を削除し、fillna(value=5) は欠損値を指定の値で埋めるだけで行を削除しない。pd.isna(df) は欠損の位置を True とする真偽値のマスクを返す。
- axis と集計の向き。df.mean() は列ごとの平均、df.mean(axis=1) は行ごとの平均で、結果は行の索引を持つ Series になる。統計の演算は一般に欠損値を除外して計算される。
- merge の結果の行数。キー列の値が一意なら、foo と bar の2行どうしの結合は2行になる。キーが重複していると一致する行どうしのあらゆる組み合わせが作られ、foo が2行ずつなら 2×2 の 4 行になる。
- groupby の流れと、行追加・dtype の注意。groupby は条件でグループに分割し、各グループに関数を適用し、結果を結合する手順で、df.groupby('A')[['C', 'D']].sum() は A の値ごとの合計を返す。行の追加はコピーが必要で高コストになりうるため、レコードを1件ずつ追加せず、作ったリストを DataFrame のコンストラクタに渡す。数値列と文字列列が混在する DataFrame の to_numpy() は共通の dtype として object になる。
この章に関連する比較記事
混同しやすい2つの概念を並べて整理した記事です。
よくある質問
Q第4章 pandasは何問収録されていますか?
現在15問を収録しています。内訳は基礎4問・標準11問です。
Q第4章 pandasの頻出論点は何ですか?
SeriesとDataFrameの基本、行・列の選択、欠損値と統計、結合とグループ化などが出題対象です(当サイト収録問題に基づく編集部集計)。
Q間違えた問題はどう復習すればいいですか?
誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。
pandas の Series と DataFrame の説明として正しいものはどれか。
答えと解説を見る
正解は「Series は1次元のラベル付き配列、DataFrame は行と列を持つ2次元のデータ構造」である。公式ドキュメントは、pandas が2種類のクラスでデータを扱うと述べ、Series を整数・文字列・Python オブジェクトなど任意の型を保持できる1次元のラベル付き配列、DataFrame を行と列を持つ表のような2次元のデータ構造と説明している。リストから Series を作ると既定の RangeIndex が付く。DataFrame の1つの列を取り出すと Series になる。型の制限はなく、数値列と文字列列を1つの DataFrame に混在させられる。
pandas 公式ドキュメント「10 minutes to pandas」
数値列と文字列列が混在する DataFrame に対して to_numpy() を呼んだとき、公式ドキュメントの説明に沿って得られる NumPy 配列の dtype はどれか。
答えと解説を見る
正解は object である。公式の注記は、NumPy 配列は配列全体で1つの dtype を持つのに対し、pandas の DataFrame は列ごとに1つの dtype を持つと説明している。to_numpy() を呼ぶと、pandas は DataFrame のすべての dtype を保持できる NumPy の dtype を探し、その共通の型が object になる場合は object の配列を返す。公式の例では、浮動小数点・日時・整数・文字列が混在する DataFrame の to_numpy() が dtype=object になっている。1つの配列に複数の dtype を持たせることはできない。
pandas 公式ドキュメント「10 minutes to pandas」
レコードを1件ずつ追加して大きな DataFrame を作る処理について、公式ドキュメントが勧めている方法はどれか。
答えと解説を見る
正解は「あらかじめ作ったレコードのリストを DataFrame のコンストラクタに渡す」である。公式の注記は、DataFrame への列の追加は比較的速いが、行の追加はコピーが必要で高コストになりうると述べ、レコードを1件ずつ追加して DataFrame を作るのではなく、構築済みのレコードのリストを DataFrame のコンストラクタに渡すことを勧めている。行の追加が禁止されているわけではなく、費用が大きくなりやすいので避けるという位置づけである。describe() は統計要約を表示するメソッドで、追加処理とは関係がない。
pandas 公式ドキュメント「10 minutes to pandas」
6行4列の DataFrame df に対して df.iloc[3:5, 0:2] を実行したとき、結果の形状(行数, 列数)はどれか。
答えと解説を見る
正解は (2, 2) である。iloc は位置(整数)で選択するメソッドで、公式ドキュメントは整数のスライスが NumPy や Python と同様に働くと説明している。3:5 は位置 3 と 4 の2行、0:2 は位置 0 と 1 の2列を選び、終端の位置は含まれない。公式の例でも df.iloc[3:5, 0:2] は2行(2013-01-04 と 2013-01-05)と A・B の2列を返している。(3, 2) は終端を含めて数えた場合の誤りで、(3, 5) と (5, 3) は開始位置と終了位置の数字をそのまま行数や列数にした誤りである。
pandas 公式ドキュメント「10 minutes to pandas」
DataFrame df の全行から、列ラベル A と B の2列だけを選ぶ書き方として公式ドキュメントの例に沿うものはどれか。
答えと解説を見る
正解は df.loc[:, ['A', 'B']] である。loc はラベルによる選択で、行の位置に : を置くと全行を、列の位置にラベルのリストを置くと指定した列だけを選ぶ。公式の例でも df.loc[:, ['A', 'B']] が全行の A 列と B 列を返している。iloc は整数の位置で選ぶため、ラベルの文字列を渡せない。df.loc[['A', 'B']] のように1つだけ渡すと、行ラベルとして解釈される。at は単一のスカラー値を速く取り出すためのもので、スライスやリストは受け付けない。
pandas 公式ドキュメント「10 minutes to pandas」
DataFrame df に対して df[df > 0] を実行したときの結果として正しいものはどれか。
答えと解説を見る
NaN になる。正解正解は「df と同じ形のまま、条件を満たさない要素が NaN になる」である。公式ドキュメントは、DataFrame から真偽条件を満たす値を選ぶ例として df[df > 0] を示し、結果では 0 以下の要素が NaN で表示されている。これに対し df[df['A'] > 0] のように1つの列の条件を渡すと、その列が条件を満たす行だけが残り、行数が減る。df > 0 だけを評価すると真偽値の DataFrame になるが、それをさらに df[...] に渡した結果は元の値と NaN からなる。
pandas 公式ドキュメント「10 minutes to pandas」
DataFrame df1 に対して、欠損値を1つでも含む行をすべて削除するメソッドの呼び出しはどれか。
答えと解説を見る
正解は df1.dropna(how='any') である。公式ドキュメントは、DataFrame.dropna() が欠損データを持つ行を削除すると説明し、how='any' の例では欠損を1つでも含む行が取り除かれ、すべて揃った行だけが残る。fillna(value=5) は欠損値を指定の値で埋めるメソッドで、行は削除されない。pd.isna() は欠損の位置を True とする真偽値のマスクを返すだけで、データは変更しない。describe() は統計の要約を表示する。
pandas 公式ドキュメント「10 minutes to pandas」
DataFrame df に対して df.mean(axis=1) を実行したとき、計算される平均はどれか。
答えと解説を見る
正解は行ごとの平均である。公式ドキュメントは、df.mean() が列ごとの平均を計算し、df.mean(axis=1) が行ごとの平均を計算すると示している。axis=1 は列方向に沿って集計することを意味し、結果は各行に対して1つずつ、行の索引を持つ Series になる。また、統計の演算は一般に欠損値を除外して計算される。axis を省略した df.mean() は列ごとの平均で、全要素を1つにまとめた平均を返すわけではない。行ごとに見たいのか列ごとに見たいのかを、axis の値で切り替えると覚えるとよい。
pandas 公式ドキュメント「10 minutes to pandas」
left(key 列が foo と foo の2行)と right(key 列が foo と foo の2行)を pd.merge(left, right, on='key') で結合したときの行数はどれか。
答えと解説を見る
正解は4行である。公式ドキュメントは merge() を特定の列をキーにした SQL 形式の結合と説明し、key が foo の行を2行ずつ持つ left と right を結合した例で、foo と foo の組み合わせすべてである 2×2=4行が結果になっている。キーが重複していると、一致する行同士のあらゆる組み合わせが作られる。一方、キーが foo と bar で一意の場合は、それぞれが1対1で対応し、結果は2行になる。行数が減るわけでも、組み合わせが八通りになるわけでもない。
pandas 公式ドキュメント「10 minutes to pandas」
列 A に値 foo と bar が混在する 8 行の DataFrame df に対して、df.groupby('A')[['C', 'D']].sum() を実行したときの結果の説明として正しいものはどれか。
答えと解説を見る
正解は「A 列の値(bar と foo)ごとに C 列と D 列を合計した、A を索引とする2行の結果」である。公式ドキュメントは、group by を、条件でデータをグループに分割し、各グループに関数を独立して適用し、結果をデータ構造に結合する手順と説明している。df.groupby('A')[['C', 'D']].sum() では A の値ごとに C と D が合計され、A の値が索引になる。MultiIndex になるのは、df.groupby(['A', 'B']) のように複数の列でグループ化した場合である。
pandas 公式ドキュメント「10 minutes to pandas」
DataFrame df に対して df['A'] を実行したとき、公式ドキュメントの説明に沿う結果はどれか。
答えと解説を見る
正解は「A 列を選び、Series を返す」である。公式ドキュメントは、DataFrame に単一のラベルを渡す df['A'] は列を選び、Series を返すと説明している。DataFrame の列は、それぞれが Series として取り出せる。行を選ぶときは、ラベルで指定する loc や位置で指定する iloc を使うので、df['A'] で行を選ぶことはない。A 列を除く操作は列を落とす別の操作で、df['A'] とは逆の結果になる。統計要約(count や mean など)を表示するのは describe() であり、df['A'] ではない。
pandas 公式ドキュメント「10 minutes to pandas」
DataFrame df の行ラベル dates[0]、列ラベル 'A' の1つの値を速く取り出す方法として、公式ドキュメントが挙げるものはどれか。
答えと解説を見る
正解は df.at[dates[0], 'A'] である。公式ドキュメントは、スカラー値(1つの値)を速く取り出すには at(ラベルで指定)と iat(位置で指定)を使うと説明しており、行ラベルと列ラベルで指定する loc と同じ値が得られる。iloc と iat は位置(整数)で指定するので、ラベルの dates[0] や 'A' を渡す形は不適切である。isin() は値の集合に含まれるかどうかで要素を判定するメソッドで、1つの値を取り出す用途ではない。ラベルか位置かを先に見分けると選びやすい。
pandas 公式ドキュメント「10 minutes to pandas」
DataFrame df から、A 列の値が 0 より大きい行だけを選ぶ書き方として、公式ドキュメントの例に沿うものはどれか。
答えと解説を見る
正解は df[df['A'] > 0] である。公式ドキュメントは、この書き方が A 列の値が 0 より大きい行を選ぶ(真偽値による選択)と説明している。df[df > 0] のように DataFrame 全体に条件を使うと、行は絞られず、形はそのままで条件を満たさない要素が NaN になる。iloc は位置(整数)による選択なので、列名 'A' を渡す書き方は公式の例にない。dropna(how='any') は欠損値を含む行を削除するメソッドで、値の大小による絞り込みとは別の操作である。
pandas 公式ドキュメント「10 minutes to pandas」
DataFrame df の欠損値について、公式ドキュメントの説明として正しいものはどれか。
答えと解説を見る
正解は「pd.isna(df) は欠損の位置を True とする真偽値のマスクを返す」である。公式ドキュメントは、dropna(how='any') は欠損値を1つでも含む行を削除し、fillna(value=5) は欠損値を指定の値で埋め、pd.isna(df) は欠損の位置を True とする真偽値のマスクを返すと説明している。したがって、fillna を行の削除と説明した選択肢や、dropna を値で埋める操作と説明した選択肢は誤りである。isna を行の削除と混同した選択肢も誤りで、isna は元の形のまま位置を示す。
pandas 公式ドキュメント「10 minutes to pandas」
キー列 key の値が foo と bar で一意な2行ずつの left と right を、pd.merge(left, right, on='key') で結合したとき、公式ドキュメントの説明に沿う結果の行数はどれか。
答えと解説を見る
正解は2行である。公式ドキュメントは、pd.merge() が特定の列をキーにした SQL 形式の結合を行うと説明している。キー列 key の値が foo と bar で、どちらも一意(各表に1行ずつ)なら、キーごとに1行が結合されて2行になる。キーの foo が両方の表に2行ずつある場合は 2×2 の4行になるが、本問のキーは一意なので4行にはならない。結合後の行数は、キーが一意かどうかと、同じキーの行が各表に何行あるかで決まるので、キーの重複の有無を最初に確かめるとよい。
pandas 公式ドキュメント「10 minutes to pandas」