LoginSignup
17
26

More than 1 year has passed since last update.

Pandas 49本かんたんノック!

Last updated at Posted at 2023-04-10

Pandasの初心者向けに、Pandasの公式チュートリアルのユースケースを簡単な49本のノック形式にしました。時間がある時にスマホで簡単に学習できます。
(正解から戻る時はブラウザの戻るボタンで戻ってください)

詳細な説明は下記の記事見てください。 本記事では正解のリンク先はあえてコマンドのみ記載し解説は最小限に絞っています。

また、実際に動作させながら確認したい場合は下記のリンクからGoogleコラボ上で実行してください。

【第1問】 pandasを使うには? $\Rightarrow$ 正解
 
【第2問】 タイタニック号の乗客データをDataFrame(df)で保存するには? ただし、何人かの乗客について名前:Name(文字)、年齢:Age(整数)、性別:Sex(男性/女性)のデータがわかっています $\Rightarrow$ 正解
 
【第3問】 テーブル(df)の年齢(Age)列のデータを扱うには? $\Rightarrow$ 正解
 
【第4問】 テーブル(df)の乗客の最大の年齢(Age)を知るには? $\Rightarrow$ 正解
 
【第5問】 テーブル(df)の数値データの基本的な統計を知るには? $\Rightarrow$ 正解
 
【第6問】 ネット上のCSVファイルで提供されているタイタニック号の乗客データ(../../titanic.csv)を分析するには? $\Rightarrow$ 正解
 
【第7問】 テーブル(df=titanic)の最初の8行を見るには? $\Rightarrow$ 正解
 
【第8問】 テーブル(df=titanic)をスプレッドシート(titanic.xlsx、シート名=passengers)として出力するには? $\Rightarrow$ 正解
 
【第9問】 テーブル(df=titanic)のテクニカルサマリーを知るには? $\Rightarrow$ 正解
 
【第10問】 テーブル(df=taitanic)の乗客の年齢(Age)を抽出するには? $\Rightarrow$ 正解
 
【第11問】 テーブル(df=taitanic)の乗客の年齢(Age)と性別(Sex)を抽出するには? $\Rightarrow$ 正解
 
【第12問】 テーブル(df=taitanic)で年齢(Age)が35歳以上の乗客を抽出するには? $\Rightarrow$ 正解
 
【第13問】 テーブル(df=taitanic)の客室クラス(Pclass)が2と3の乗客を抽出するには? $\Rightarrow$ 正解
 
【第14問】 テーブル(df=taitanic)の年齢(Age)がわかっている乗客データのみを扱うには? $\Rightarrow$ 正解
 
【第15問】 テーブル(df=taitanic)の年齢(Age)が35歳以上の乗客の名前(Name)を抽出するには? $\Rightarrow$ 正解
 
【第16問】 テーブル(df=taitanic)の10行目から25行目までと、3列目から5列目を抽出するには? $\Rightarrow$ 正解
 
【第17問】 テーブル(df=air_quality)を素早く視覚的に確認(ラインプロット)するには? $\Rightarrow$ 正解
 
【第18問】 テーブル(df=air_quality)のパリ(station_paris)のデータ列だけでプロットするには? $\Rightarrow$ 正解
 
【第19問】 テーブル(df=air_quality)のロンドン(station_london)とパリ(station_paris)で測定されたデータ(N02)の値を視覚的(散布図)に比較するには? $\Rightarrow$ 正解
 
【第20問】 テーブル(df=air_quality)のそれぞれの列を別のサブプロットにするには? $\Rightarrow$ 正解
 
【第21問】 テーブル(df=air_quality)のできあがったプロットをさらにカスタマイズしたり、拡張したり、保存したりするには? $\Rightarrow$ 正解
 
【第22問】 テーブル(df=air_quality)のロンドン駅(station_london)のデータ( NO2 濃度)を mg/m3 で新たな列(london_mg_per_cubic)で追加するには?
(温度を 25℃、圧力を1013 hPaとすると、換算係数は1.882) $\Rightarrow$ 正解
 
【第23問】 テーブル(df=air_quality)のパリ駅(station_paris)とアントワープ駅(station_antwerp)の値の比率を調べて、その結果を新たな列(ratio_paris_antwerp)で追加するには? $\Rightarrow$ 正解
 
【第24問】 テーブル(df=air_quality)のデータカラムの名前を、openAQで使用される対応するステーション識別子に変更(station_antwerp -> BETR801,station_paris -> FR04014,station_london -> London Westminster)して新たなDataFrame(air_quality_renamed)を生成するには?  $\Rightarrow$ 正解
 
【第25問】 テーブル(df=taitanic)の乗客の平均の年齢(Age)を求めるには? $\Rightarrow$ 正解
 
【第26問】 テーブル(df=taitanic)の乗客の年齢(Age)とチケット料金(Fare)の中央値を知るには? $\Rightarrow$ 正解
 
【第27問】 テーブル(df=taitanic)の乗客の性別(Sex)の男性と女性の平均の年齢(Age)を知るには? $\Rightarrow$ 正解
 
【第28問】 テーブル(df=taitanic)の性別(Sex)とキャビンクラス(Pclass)の組み合わせごとに、航空券の平均の運賃価格(Fare)を知るには? $\Rightarrow$ 正解
 
【第29問】 テーブル(df=taitanic)のそれぞれのキャビンクラス(Pclass)の乗客数を知るには? $\Rightarrow$ 正解
 
【第30問】 テーブル(df=taitanic)のデータを乗客の年齢(Age)に応じてソートするには? $\Rightarrow$ 正解
 
【第31問】 テーブル(df=taitanic)のデータを、キャビンクラス(Pclass)と年齢(Age)に応じて降順に並べ替えるには? $\Rightarrow$ 正解
 
【第32問】 テーブル(df=no2_subset)の3つの観測所(location)が持っている値(Value)を隣り合った別の列にするには? $\Rightarrow$ 正解
 
【第33問】 テーブル(df=air_quality)の各観測所(location)における測定パラメータ(parameter)であるNO2 と PM2.5 の平均の濃度(value)を表形式で求めるには? $\Rightarrow$ 正解
 
【第34問】 テーブル(df=no2_pivoted)のすべての大気中のNO2測定値を1つのカラムに集めてno_2データフレームを作成するには(ロングフォーマット) ? ただし、date.utcはid識別です。
$\Rightarrow$ 正解
 
【第35問】 似たような構造を持つ2つのテーブル、NO2(air_quality_no2)と PM25 (air_quality_pm25)の測定値を1つのテーブル(air_quality)にまとめるには? $\Rightarrow$ 正解
 
【第36問】 ステーションのメタデータ・テーブル(stations_coord)で提供されるステーションの座標を、測定値テーブル(air_quality)の対応する行に追加するには? 両テーブルには共通してlocationという項目があります。 $\Rightarrow$ 正解
 
【第37問】 パラメータメタデータテーブル(air_quality_parameters)で提供されるパラメータの完全な説明と名前を、測定値テーブル(air_quality)に追加するには? 両テーブルには共通した項目はありませんが、パラメータメタデータテーブルのid列と測定値テーブルのparameter列とが対応しています。 $\Rightarrow$ 正解
 
【第38問】 テーブル(df=air_quality)のdatetime列の日付を、プレーンテキストではなくdatetimeオブジェクトとして扱うには? $\Rightarrow$ 正解
 
【第39問】 テーブル(df=air_quality)に計測した月のみを含む新しい列(month)に追加するには? なお、datetime列がdatetimeオブジェクトとして定義されています。$\Rightarrow$ 正解
 
【第40問】 テーブル(df=air_quality)の各測定場所(location)のdatetime列の各曜日の平均のNO2濃度(value)を知るには? $\Rightarrow$ 正解
 
【第41問】 テーブル(df=air_quality)のすべての観測所の時系列をまとめて、日中の典型的なNO2濃度(value)のパターンをプロットするには?。言い換えれば1日の各時間の平均値はどのくらいかを見るには? $\Rightarrow$ 正解
 
【第42問】 テーブル(df=no_2)の2019年5月20日から2019年5月21日までの各観測所のNO2値をプロットするには? ただし、no_2テーブルにはdatetimeインデックスが適用済みです。 $\Rightarrow$ 正解
 
【第43問】 テーブル(df=no_2)で現在の1時間ごとの時系列値を各観測所の月間最大値に集約して、新たにテーブル(df=monthly_max)を生成するには? ただし、no_2テーブルにはdatetimeインデックスが適用済みです。
$\Rightarrow$ 正解
 
【第44問】 テーブル(df=no_2)各観測所のNO2濃度の日平均値をプロットするには? ただし、no_2テーブルにはdatetimeインデックスが適用済みです。 $\Rightarrow$ 正解
 
【第45問】 テーブル(df=taitanic)の名前(Name)の文字をすべて小文字にするには? $\Rightarrow$ 正解
 
【第46問】 テーブル(df=taitanic)の名前(Name)のカンマの前の部分を抽出して、乗客の姓を含む新しい列(Surname)を作成するには? $\Rightarrow$ 正解
 
【第47問】 テーブル(df=taitanic)でタイタニック号に乗船していた名前(Name)から伯爵夫人(Countess)の乗客データを抽出するには? $\Rightarrow$ 正解
 
【第48問】 テーブル(df=taitanic)のタイタニックの乗客の中で、最も長い名前(Name)を持つ人を抽出するには? $\Rightarrow$ 正解
 
【第49問】 テーブル(df=taitanic)の性別(sex)で、男性(male)の値を「M」に、女性(female)の値を「F」に置き換えるには? $\Rightarrow$ 正解

解答

1問目


import pandas as pd

 
 
 
 
 
 
 
 
 
 
 

2問目


df = pd.DataFrame(
     {
         "Name": [
             "Braund, Mr. Owen Harris",
             "Allen, Mr. William Henry",
             "Bonnell, Miss. Elizabeth",
         ],
         "Age": [22, 35, 58],
         "Sex": ["male", "male", "female"],
     }
 )

行列は縦ベクトルが横に並んだものと覚えておくと上記の記載がイメージしやすいと思います(Pandasでは行列はDataFrame(テーブル)、列はSeriesと呼ぶのでSeriesが横に並んだものになります)。まず列名(カラム名)を記載してその要素を記載します。

 
 
 
 
 
 
 
 
 
 
 

3問目


 df["Age"]

テーブルから1つのカラムを選んでいるので結果はSeriesになります。

 
 
 
 
 
 
 
 
 
 
 

4問目


df["Age"].max()

 
 
 
 
 
 
 
 
 
 
 

5問目


df.describe()

 
 
 
 
 
 
 
 
 
 
 

6問目


# Githubに公開されているデータを直接読み込む
url = 'https://raw.githubusercontent.com/pandas-dev/pandas/master/doc/data/titanic.csv'
titanic = pd.read_csv(url)

 
 
 
 
 
 
 
 
 
 
 

7問目


titanic.head(8)

後ろから見るにはtail()メソッドを使います。

 
 
 
 
 
 
 
 
 
 
 

8問目


titanic.to_excel("titanic.xlsx", sheet_name="passengers", index=False)

pandasが各カラムのデータタイプをどのように解釈したかを確認するには、dtypes属性を使います。

 
 
 
 
 
 
 
 
 
 
 

9問目


titanic.info()

列名、not-nullの数、dtype等が表示されます。

 
 
 
 
 
 
 
 
 
 
 

10問目


ages = titanic["Age"]

 
 
 
 
 
 
 
 
 
 
 

11問目


age_sex = titanic[["Age", "Sex"]]

内側の括弧$[\hspace{3mm} ]$の中に選択する列名をリストします。

 
 
 
 
 
 
 
 
 
 
 

12問目


above_35 = titanic[titanic["Age"] > 35]

括弧$[\hspace{3mm} ]$に条件をしているすることで選択する行のブーリアン値(TrueまたはFalse)のリストが生成され $True$ の行が選択されるイメージです。

 
 
 
 
 
 
 
 
 
 
 

13問目


class_23 = titanic[titanic["Pclass"].isin([2, 3])]

 
 
 
 
 
 
 
 
 
 
 

14問目


age_no_na = titanic[titanic["Age"].notna()]

 
 
 
 
 
 
 
 
 
 
 

15問目


adult_names = titanic.loc[titanic["Age"] > 35, "Name"]

 
 
 
 
 
 
 
 
 
 
 

16問目


titanic.iloc[9:25, 2:5]

 
 
 
 
 
 
 
 
 
 
 

17問目


air_quality.plot()

 
 
 
 
 
 
 
 
 
 
 

18問目


air_quality["station_paris"].plot()

 
 
 
 
 
 
 
 
 
 
 

19問目


air_quality.plot.scatter(x="station_london", y="station_paris", alpha=0.5)

 
 
 
 
 
 
 
 
 
 
 

20問目


axs = air_quality.plot.area(figsize=(12, 4), subplots=True)

 
 
 
 
 
 
 
 
 
 
 

21問目


import matplotlib.pyplot as plt            # matplotlibをインポート
fig, axs = plt.subplots(figsize=(12, 4))   
air_quality.plot.area(ax=axs)               # matplot上のオブジェクト上に描画
axs.set_ylabel("NO$_2$ concentration")      # y軸のラベルを設定、その他さまざまなmatplotlibの機能が使えます
fig.savefig("no2_concentrations.png")       # matplotlibの機能を使って画像の保存、DIR直下にpngファイルが生成されます

y軸のラベル設定に使用されている$_2$Sで囲まれた文字列はLatex表記です(今回の場合は下付きの文字で数字の2)。複雑な数式等を記載することが可能です。詳細は下記の記事も参考にしてください。
これで完璧 Qiitaでの数式記法(統計学対応)

 
 
 
 
 
 
 
 
 
 
 

22問目


air_quality["london_mg_per_cubic"] = air_quality["station_london"] * 1.882

 
 
 
 
 
 
 
 
 
 
 

23問目


air_quality["ratio_paris_antwerp"] = (
    air_quality["station_paris"] / air_quality["station_antwerp"]
)

 
 
 
 
 
 
 
 
 
 
 

24問目


air_quality_renamed = air_quality.rename(
    columns={
        "station_antwerp": "BETR801",
        "station_paris": "FR04014",
        "station_london": "London Westminster",
    }
)

 
 
 
 
 
 
 
 
 
 
 

25問目


titanic["Age"].mean()

 
 
 
 
 
 
 
 
 
 
 

26問目


titanic[["Age", "Fare"]].median()

 
 
 
 
 
 
 
 
 
 
 

27問目


titanic[["Sex", "Age"]].groupby("Sex").mean()

titanic.groupby("Sex")["Age"].mean() でも結果は同じです

 
 
 
 
 
 
 
 
 
 
 

28問目


titanic.groupby(["Sex", "Pclass"])["Fare"].mean()

 
 
 
 
 
 
 
 
 
 
 

29問目


titanic["Pclass"].value_counts()

titanic.groupby("Pclass")["Pclass"].count() でも結果は同じです

 
 
 
 
 
 
 
 
 
 
 

30問目


titanic.sort_values(by="Age")

 
 
 
 
 
 
 
 
 
 
 

31問目


titanic.sort_values(by=['Pclass', 'Age'], ascending=False)

 
 
 
 
 
 
 
 
 
 
 

32問目


no2_subset.pivot(columns="location", values="value")

 
 
 
 
 
 
 
 
 
 
 

33問目


air_quality.pivot_table(
    values="value", index="location", columns="parameter", aggfunc="mean"
)

 
 
 
 
 
 
 
 
 
 
 

34問目


no_2 = no2_pivoted.melt(id_vars="date.utc")

 
 
 
 
 
 
 
 
 
 
 

35問目


air_quality = pd.concat([air_quality_pm25, air_quality_no2], axis=0)

 
 
 
 
 
 
 
 
 
 
 

36問目


air_quality = pd.merge(air_quality, stations_coord, how="left", on="location")

 
 
 
 
 
 
 
 
 
 
 

37問目


air_quality = pd.merge(air_quality, air_quality_parameters,
                      how='left', left_on='parameter', right_on='id')

 
 
 
 
 
 
 
 
 
 
 

38問目


air_quality["datetime"] = pd.to_datetime(air_quality["datetime"])

 
 
 
 
 
 
 
 
 
 
 

39問目


air_quality["month"] = air_quality["datetime"].dt.month

 
 
 
 
 
 
 
 
 
 
 

40問目


air_quality.groupby(
    [air_quality["datetime"].dt.weekday, "location"])["value"].mean()

 
 
 
 
 
 
 
 
 
 
 

41問目


fig, axs = plt.subplots(figsize=(12, 4))
air_quality.groupby(air_quality["datetime"].dt.hour)["value"].mean().plot(
    kind='bar', rot=0, ax=axs
)
plt.xlabel("Hour of the day")  # custom x label using matplotlib
plt.ylabel("$NO_2 (µg/m^3)$")

 
 
 
 
 
 
 
 
 
 
 

42問目


no_2["2019-05-20":"2019-05-21"].plot()

 
 
 
 
 
 
 
 
 
 
 

43問目


monthly_max = no_2.resample("M").max()

 
 
 
 
 
 
 
 
 
 
 

44問目


no_2.resample("D").mean().plot(style="-o", figsize=(10, 5))

 
 
 
 
 
 
 
 
 
 
 

45問目


titanic["Name"].str.lower()

 
 
 
 
 
 
 
 
 
 
 

46問目


titanic["Surname"] = titanic["Name"].str.split(",").str.get(0)

 
 
 
 
 
 
 
 
 
 
 

47問目


titanic["Name"].str.contains("Countess")

 
 
 
 
 
 
 
 
 
 
 

48問目


titanic.loc[titanic["Name"].str.len().idxmax(), "Name"]

 
 
 
 
 
 
 
 
 
 
 

49問目


titanic["Sex_short"] = titanic["Sex"].replace({"male": "M", "female": "F"})

 
 

おわりに

Pandasチュートリアルをはじめ、データサイエンスの各種チュートリアルをGoogleコラボで動かしながら気軽に学習できるコンテンツも公開していますのでご活用ください。

17
26
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
26