芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

pandas 私的メモ3

要素から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にはindexcolumnsがない.代わりに以上のものが用意されている.まとめると,

  • items
  • major_axis:indexの代わり?
  • minor_axis:columnsの代わり?

という感じだな.同じようにメソッドを呼ぶとリストが返される.なので,バラして使いたい場合は上記の要素の例のようにenumerateforを組み合わせて使うとよいだろう.
あと,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)

引数に何も指定しないと空のオブジェクトが作れる.