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習得の助けになれば幸いです。