配列をDataFrameに変換した結果が同じであることに、引きずられてしまっていないでしょうか。
変換した結果が同じであることは、元のデータが同じであることを意味しません。
python
1>>> pd.DataFrame([0, 1, 2])
2 0
30 0
41 1
52 2
6>>> pd.DataFrame({0: [0, 1, 2]})
7 0
80 0
91 1
102 2
11>>> pd.DataFrame({0: {0: 0, 1: 1, 2: 2}})
12 0
130 0
141 1
152 2
これらはすべて同じDataFrameを返していますが、そのことをもって[0, 1, 2]
と{0: [0, 1, 2]}
と{0: {0: 0, 1: 1, 2: 2}}
は同じデータだと考えることはできません。
同様に、
python
1>>> pd.DataFrame(np.array([0, 1, 2]))
2 0
30 0
41 1
52 2
6>>> pd.DataFrame(np.array([[0], [1], [2]]))
7 0
80 0
91 1
102 2
この二つはどちらも同じDataFrameを返していますが、np.array([0, 1, 2])
とnp.array([[0], [1], [2]])
は同じものではありません。[0, 1, 2]
と[[0], [1], [2]]
も同じものではありません
1次元配列を元にDataFrameを作るとき、DataFrameは2次元のデータ構造なので、1次元配列は2次元のデータ構造に変換されます。
python
1>>> pd.DataFrame(np.array([0, 1, 2]))
2 0
30 0
41 1
52 2
6>>> pd.DataFrame(np.array([0, 1, 2])).values
7array([[0],
8 [1],
9 [2]])
10>>> pd.DataFrame(np.array([0, 1, 2])).shape
11(3, 1)
このときnp.array([0, 1, 2]))
が、(1, n)
ではなく、(n, 1)
の形でDateFrameに変換されるのは、1次元配列を読み込むときはそのように読み込むように、Pandasが作られているからです。「1次元配列は (n, 1) の2次元配列と同じ」だからそうなっているのではありません。
1次元配列と (1, n) の2次元配列がどう違うか、また1次元配列と (n, 1) の2次元配列がどう違うかが分からない、同じように思える、のでしたら、いちど下記のように配列から値を取り出す単純な操作をして、その違いを考えてみてはいかがでしょうか。
1次元配列から値を取り出すとその値はスカラー値で、それ以上の構造は持っていませんが、2次元配列から値を取り出すと、その値も配列で、さらにその配列から値を取り出すことができる、という違いがあります。
python
1>>> np.array([0, 1, 2])
2array([0, 1, 2])
3>>> np.array([0, 1, 2])[0]
40
5>>> np.array([0, 1, 2])[1]
61
7>>> np.array([0, 1, 2])[2]
82
9>>> np.array([0, 1, 2])[0][1]
10Traceback (most recent call last):
11 File "<stdin>", line 1, in <module>
12IndexError: invalid index to scalar variable.
python
1>>> np.array([[0], [1], [2]])
2array([[0],
3 [1],
4 [2]])
5>>> np.array([[0], [1], [2]])[0]
6array([0])
7>>> np.array([[0], [1], [2]])[1]
8array([1])
9>>> np.array([[0], [1], [2]])[2]
10array([2])
11>>> np.array([[0], [1], [2]])[0][0]
120
13>>> np.array([[0], [1], [2]])[1][0]
141
15>>> np.array([[0], [1], [2]])[2][0]
162
17>>> np.array([[0], [1], [2]])[0][1]
18Traceback (most recent call last):
19 File "<stdin>", line 1, in <module>
20IndexError: index 1 is out of bounds for axis 0 with size 1
python
1>>> np.array([[0, 1, 2]])
2array([[0, 1, 2]])
3>>> np.array([[0, 1, 2]])[0]
4array([0, 1, 2])
5>>> np.array([[0, 1, 2]])[1]
6Traceback (most recent call last):
7 File "<stdin>", line 1, in <module>
8IndexError: index 1 is out of bounds for axis 0 with size 1
9>>> np.array([[0, 1, 2]])[0][0]
100
11>>> np.array([[0, 1, 2]])[0][1]
121
13>>> np.array([[0, 1, 2]])[0][2]
142
もうひとついえば、np.array([0, 1, 2])のshapeの値が(3,)
という表記なのは、shapeメソッドの返す値がPythonのtupleデータ型だからです。(n,)
は値がひとつだけのtupleデータ型のリテラル表記です。本当だったらnp.array([0, 1, 2])のshapeが返す値は(3)
という表記でもいいのです。(3,)
という表記であることに意味はありません。
python
1>>> np.array([0, 1, 2])
2array([0, 1, 2])
3>>> np.array([0, 1, 2]).shape
4(3,)
5>>> type(np.array([0, 1, 2]).shape)
6<class 'tuple'>