こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

pandas はなぜ列単位で管理している?

pandas の DataFrame は、行(row)単位ではなく列(column)単位で管理していると聞きました。
例えば、df[0] の戻り値は1行ではなく1列です。
行をレコードやオブジェクトとして考えると、行単位での管理が直感的と感じていますが、このように列単位での管理になっているのはなぜでしょうか。
メリットを教えてください。

投稿日時 - 2018-11-29 14:48:43

QNo.9562871

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

CSVを自在に扱いたいからです。

そのCSVが何行あるかは改行の数ですから何も気にする必要はありません。
しかし、CSVというのをスペーシングしようとしたら、1行目が2項目しかなくて2行目は10項目あるなんていうデータを扱うのは困難です。

その表は10項目存在していて、たまたま1行目のものには3項目以後がない、ということを判別するためには2行目以降最後の行までみないとわかりません。
そういう扱いをするなら、pdというインスタンスは縦のデータを積み上げるようにしたほうが間違いなく簡単だからです。

投稿日時 - 2018-11-30 10:17:32

補足

※等幅でご覧ください。

次のCSVがあるとします。

a,b,c,d,e
1,2,3,4
A,B,C,D,E
x,y,z

改行を記号 \n で表すと

a,b,c,d,e\n1,2,3,4\nA,B,C,D,E\nx,y,z\n

という1次元のデータ列です。
このCSVをパースして下記のテーブルにするとします。

A列B列C列D列E列
↓ ↓ ↓ ↓ ↓
+--+--+--+--+--+
|a |b |c |d |e | ← 1行
+--+--+--+--+--+
|1 |2 |3 |4 | | ← 2行
+--+--+--+--+--+
|A |B |C |D |E | ← 3行
+--+--+--+--+--+
|x |y |z | | | ← 4行
+--+--+--+--+--+

pandas は列単位での管理ですので

[
[a, 1, A, x], # A列
[b, 2, B, y], # B列
[c, 3, C, z], # C列
[d, 4, D, None], # D列
[e, None, E, None] # E列
]

という構造を持っていると考えています。
ここで、

> CSVというのをスペーシングしようとしたら、

スペーシングとは、パースの間違いでしょうか。
それとも本当に空白を入れる処理のことでしょうか。

> 1行目が2項目しかなくて2行目は10項目あるなんていうデータを扱うのは困難です。
> その表は10項目存在していて、たまたま1行目のものには3項目以後がない、ということを判別するためには2行目以降最後の行までみないとわかりません。

はい。
上記の図でいう、A列、B列、C列 … とすべての列は、CSV の末尾までパースしないと要素が決定できません。

行単位管理であれば、

[
[a, b, c, d, e], # 1行
[1, 2, 3, 4], # 2行
[A, B, C, D, E], # 3行
[x, y, z], # 4行
]

という保持の仕方となり、1行目は次の下線部さえ読めば決定できます。

a,b,c,d,e\n1,2,3,4\nA,B,C,D,E\nx,y,z\n
~~~~~~~~~~~
列単位の管理であれば、

a,b,c,d,e\n1,2,3,4\nA,B,C,D,E\nx,y,z\n
~~ ~~~~ ~~~~ ~~~~ ~~
の下線部をEOFまで見ないといけません。

質問は「なぜ行単位ではなく列単位で管理しているのか?」です。

ご回答は行と列を取り違えているように感じました。
よろしくお願いします。

投稿日時 - 2018-11-30 17:58:22

あなたにオススメの質問