芋の独り言

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

pandas 私的メモ2

axis=0で列(columnsもしくは縦),axis=1で行(indexもしくは横)...
→行列においては,行 rowが横,列 columnが縦のラインを指す.indexは索引の意,数学では指数の意.

csvファイルの読み込み(列名・行名あり)

以下のファイルを読み込み,操作を行う.

,1,2,3,4
A,10,5,8,3
B,5,20,5,15
C,8,2,16,4
D,6,6,12,18

csvには以上のファイルのパス(アドレス)が代入されているとする.

import pandas as pd
data = pd.read_csv(csv, engine='python',header=0, index_col=0)

index_col=0で列名が認識される.ちなみに,DataFrameとして作るなら以下のような感じ.

>>> 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

転置

numpyと同じ.Tメソッドで転置したものが得られる.ただし,Seriesでやっても変更されない. また,元のデータフレームは変更されていない.

>>> data.T
    A   B   C   D
1  10   5   8   6
2   5  20   2   6
3   8   5  16  12
4   3  15   4  18
>>> 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
>>> sr = pd.Series([0,1,2,3])
>>> sr
0    0
1    1
2    2
3    3
dtype: int64
>>> sr.T
0    0
1    1
2    2
3    3
dtype: int64

合計値を出したり...

sumメソッドでaxisで指定した方向に合計値を出した結果が返却される. 以下の例では列ごとに合計値を求めている.

>>> data_sum = data.sum(axis=0,numeric_only=True)
>>> data_sum
1    29
2    33
3    41
4    40
dtype: int64
>>> type(data_sum)
<class 'pandas.core.series.Series'>
>>> data/data_sum*100
           1          2          3     4
A  34.482759  15.151515  19.512195   7.5
B  17.241379  60.606061  12.195122  37.5
C  27.586207   6.060606  39.024390  10.0
D  20.689655  18.181818  29.268293  45.0

DataFrameでsumを使った場合,返却されるのはSeriesであり,Seriesはcolumnsがない.なので,columnsを呼ぼうとするとAttributeError: 'Series' object has no attribute 'columns'が吐き出される.
以上のように+-*/といった算術演算子を適用させると,各要素に適用されたものが返却される. また,以上の場合のDataFrameとSeriesでの演算は列ごとに計算される.このことを用いて,以上では各列ごとに百分率表示にしたDataFrameを作成した.

行の追加

>>> data.loc['合計'] = data.sum(axis=0,numeric_only=True)
>>> 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
合計  29  33  41  40
>>> data['合計']
Traceback (most recent call last):
・・・
KeyError: '合計'
>>> data.loc['合計']
1    29
2    33
3    41
4    40
Name: 合計, dtype: int64
>>> wariai = data/data.loc['合計']*100
>>> wariai.loc['合計数'] = data.loc['合計']
>>> wariai
              1           2           3      4
A     34.482759   15.151515   19.512195    7.5
B     17.241379   60.606061   12.195122   37.5
C     27.586207    6.060606   39.024390   10.0
D     20.689655   18.181818   29.268293   45.0
合計   100.000000  100.000000  100.000000  100.0
合計数   29.000000   33.000000   41.000000   40.0

data['合計']KeyError: '合計'が出る.なので,locで追加したものはlocで呼び出す必要がある.

参考