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コラボで動かしながら気軽に学習できるコンテンツも公開していますのでご活用ください。