🙌

RailsマンにとってPandasのDataFrame型がモヤモヤする理由

2021/09/06に公開

PandasのDataFrame型はモヤモヤする

当方、元々Rails歴3年で、最近Kaggleを始めた超初心者なのですが、Railsの経験が活かされる場面もあれば、逆にRailsの経験がバイアスになり混乱する場面もあります。入門してまず躓いたのは、PandasのDataFrame型です。特にdf['name']df.iloc[0]とやらで混乱してしまいました。

RailsとPandas テーブルデータの操作の違い

例えば、次のようなテーブルデータからオブジェクトを作成し、1行目・1列目を取り出す場合のコードの違いを比較します。

id name
1 田中太郎
2 佐藤花子
3 山田一郎

PandasのDataFrame型

data = {
    'id': [1, 2, 3],
    'name': ['田中太郎', '佐藤花子', '山田一郎']
}
users = pd.DataFrame(data)

# 1行目を取り出したいとき
users.iloc[0]

# 1列目を取り出したいとき
users['id']

RailsのActive Record

data = [
    {id: 1, name: '田中太郎'},
    {id: 2: name: '佐藤花子'},
    {id: 3: name: '山田一郎'},
]
users = User.new(data)

# 1行目を取り出したいとき
users[0]

# 1列目を取り出したいとき
users.select('id')

何が違うのか?

PandasもRailsも、テーブルのデータを操作するという点で共通ですが、決定的に違う点があります。それはズバリ、

Pandasは列でデータを区切るが、
Railsは行でデータを区切る

という違いになります。

それぞれのdataの型を見比べればさらに明らかになります。
Pandasでは辞書型になっていますが、Railsでは配列型になっています。

実はPandasがusers['id']と書くのは、Pandasだから(あるいはPythonだから)ではなく、辞書型だから当然のことなのです。

なぜ違うのか?(私見)

どちらもテーブルのデータを操作するという点で共通ですが、なぜPandasでは列でデータを区切り、Railsは行でデータを区切るのでしょうか?
これは公式の見解ではなく、私見になります。
それは単純に、PandasとRailsで用途が違うから だと思います。

Pandasの用途はデータ分析なので、行よりも列を柔軟に扱いたい
→データ分析では、列ごとに何かしらの処理をしたいことが多いです。例えばある列の平均値を算出したり、ある列の欠損値を埋めたりなど。逆に分析対象のデータの行数が増減したり、行ごとに抽出したりするシーンは比較的少ないのだと思います。なので列ごとにデータを区切ったほうが都合が良いです。

Railsの用途はWeb開発なので、列よりも行を柔軟に扱いたい
→一方、Web開発では行ごとに何かしらの処理をしたいことが多いです。where文である条件に合致する行だけを抽出したり、行の新規追加、削除、更新など。逆にテーブルの列が増減したりは比較的少ないと思います。なので行ごとにデータを区切ったほうが都合が良いです。

PandasのDataFrameはスバラシイ

以上のように理解してから、PandasのDataFrame型と仲良くなれた気がします。公式の見解ではありませんが、少しでもPandas習得の助けになれば幸いです。

Discussion