要素からindex名を
- pandas.core.panel.Panel:3次元(立体)
- indexなし
- columnsなし
↓抽出 ↑結合?
- pandas.core.frame.DataFrame:2次元(平面)
- indexあり
- columnsあり
↓抽出 ↑結合(concat
など)
- pandas.core.series.Series:1次元(線)
- indexあり
- columnsなし
↓抽出
- numpy.int64もしくはint:0次元(点)
- indexなし
- columnsなし
要素を抽出した後,その要素のindex名が知りたかったのだが,上記の通りそれは無理. ということで,以下のようにすればいいんじゃないかと思いついた.
>>> import pandas as pd >>> data = pd.DataFrame([[10,5,8,3],[5,20,5,15],[8,2,16,4],[6,6,12,18]],index=['A','B','C','D'],columns=['1','2','3','4']) >>> data 1 2 3 4 A 10 5 8 3 B 5 20 5 15 C 8 2 16 4 D 6 6 12 18 >>> for c in data.columns: i=data[c].index print(i) for n,y in enumerate(data[c]): print(i[n],':',y) Index(['A', 'B', 'C', 'D'], dtype='object') A : 10 B : 5 C : 8 D : 6 Index(['A', 'B', 'C', 'D'], dtype='object') A : 5 B : 20 C : 2 D : 6 Index(['A', 'B', 'C', 'D'], dtype='object') A : 8 B : 5 C : 16 D : 12 Index(['A', 'B', 'C', 'D'], dtype='object') A : 3 B : 15 C : 4 D : 18
列ごとに読み込み,さらに順に要素を呼び出し,その要素に対応するindex名(正確には違うかもしれないが)を取得できた.
数値データからランキングデータを作るのに使えると思う.まぁ,そんな感じのことやるのに考えたわけだが.
→と書いたんですが,sort_values
の方が適しているというか...sort_values
した後にindex
で並び替えられたものを取り出せばいいだけですね...まぁ,何かに使えるかもしれないので,記事自体は残しておきますがね.
で,今度は逆に要素からpandas.core.series.Seriesとかを作れないかなぁと思って,
>>> pd.concat([data['1']['A'],data['2']['B']]) Traceback (most recent call last): ・・・ TypeError: cannot concatenate object of type "<class 'numpy.int64'>"; only pd.Series, pd.DataFrame, and pd.Panel (deprecated) objs are valid
となったわけで.じゃぁ,こうするしかないなぁ.
>>> c = pd.Series([data['1']['A'],data['2']['B']]) >>> c 0 10 1 20 dtype: int64 >>> c = pd.Series({1:data['1']['A'],2:data['2']['B']}) >>> c 1 10 2 20 dtype: int64
こうした後にconcat
とかでつなげばpd.DataFrameになる.リストでも辞書型でもよい.
余談:pd.Panel
上記のconcat
のエラーで初めてその存在を知った...3次元データのためのオブジェクト.
>>> three = pd.Panel([data,data,data]) Warning (from warnings module): ・・・ Traceback (most recent call last): ・・・ ValueError: The number of dimensions required is 3, but the number of dimensions of the ndarray given was 2 >>> three = pd.Panel({1:data,2:data,3:data}) >>> three <class 'pandas.core.panel.Panel'> Dimensions: 3 (items) x 4 (major_axis) x 4 (minor_axis) Items axis: 1 to 3 Major_axis axis: A to D Minor_axis axis: 1 to 4 >>> three.items Int64Index([1, 2, 3], dtype='int64') >>> three.major_axis Index(['A', 'B', 'C', 'D'], dtype='object') >>> three.minor_axis Index(['1', '2', '3', '4'], dtype='object')
一番最初にまとめて書いたように,pd.Panelにはindex
とcolumns
がない.代わりに以上のものが用意されている.まとめると,
- items
- major_axis:indexの代わり?
- minor_axis:columnsの代わり?
という感じだな.同じようにメソッドを呼ぶとリストが返される.なので,バラして使いたい場合は上記の要素の例のようにenumerate
とfor
を組み合わせて使うとよいだろう.
あと,pd.Panelを作る際には辞書型でないと駄目なようだ.予め名前を付けとかないと駄目なわけか.違うかもしれんが.とりあえず,しばらくはpd.Panelを使いそうにないので置いておこう.
↓参考
pandas で 3 次元のデータ構造を扱う - Qiita
余談:空のデータフレーム
>>> g=pd.Panel() >>> g <class 'pandas.core.panel.Panel'> Dimensions: 0 (items) x 0 (major_axis) x 0 (minor_axis) Items axis: None Major_axis axis: None Minor_axis axis: None >>> g=pd.DataFrame() >>> g Empty DataFrame Columns: [] Index: [] >>> g=pd.Series() >>> g Series([], dtype: float64)
引数に何も指定しないと空のオブジェクトが作れる.