[A-00137]pythonでpandasを使ってみる

pythonのライブラリであるpandasを使ってみる。

これはデータ分析ライブラリの一つです。

・一次元データの取り扱い

pandasで一次元データを取り扱う場合の簡単な例を示す。

具体的にはSeriesメソッドを使用する。

import pandas as pd

def printOneDimension():
    list1 = [12,24,36]
    data1 = pd.Series(list1)
    print(data1)
    

if __name__ == "__main__":
    printOneDimension()
(.venv) MacBook-Pro:test1$ python3 one_dimension.py 
0    12
1    24
2    36

上記の場合、インデックスが0~1となっているがこれを変更できる。Seriesメソッドの引数にindexを指定する。

import pandas as pd

def printOneDimension():
    list1 = [12,24,36]
    data1 = pd.Series(list1, index=["id1","id2","id3"])
    print(data1)
    

if __name__ == "__main__":
    printOneDimension()
(.venv) MacBook-Pro:test1$ python3 one_dimension.py 
id1    12
id2    24
id3    36

・二次元データの取り扱い

上記と同じく、2次元データの場合は下記のようになる。この場合はDataFrameメソッドを使用する。

import pandas as pd

    
def printTwoDimension():
    list1 = [[12,13],[15,16],[28,27]]
    data2 = pd.DataFrame(list1)
    print(data2)

if __name__ == "__main__":
    printTwoDimension()
(.venv) MacBook-Pro:test1$ python3 two_dimension.py 
    0   1
0  12  13
1  15  16
2  28  27

こちらも同様にindexを指定でき、さらにcolumn名も指定できる

import pandas as pd

    
def printTwoDimension():
    list1 = [[12,13],[15,16],[28,27]]
    data2 = pd.DataFrame(list1, index=["idx1","idx2", "idx3"], columns=["col1","col2"])
    print(data2)

if __name__ == "__main__":
    printTwoDimension()
(.venv) MacBook-Pro:test1$ python3 two_dimension.py 
id1    12
id2    24
id3    36
dtype: int64
      col1  col2
idx1    12    13
idx2    15    16
idx3    28    27

・CSVの読み込み・分解

多くのデータフォーマットはCSVであることが多い。pandasでもCSVを読み込み、DBテーブルのように扱える。

id,name,class,age,grade
01,"kiyohiko kuroda", "class-4",6,1
02,"yosuke tanaka","class-1",12,6
03,"hiroshi suenaga","class-3",8,3

上記のテスト用CSVファイルを読みこむ。

import pandas as pd

def main():
    df = pd.read_csv('./files/test.csv', sep=',',header=0)
    print(df.tail())

if __name__ == "__main__":
    main()
(.venv) MacBook-Pro:test1$ python3 read_csv.py 
   id             name    class  age  grade
0   1  kiyohiko kuroda  class-4    6      1
1   2    yosuke tanaka  class-1   12      6
2   3  hiroshi suenaga  class-3    8      3

・CSVに対してクエリの実行

読み込んだCSVデータに対してクエリを実行できる。下記の場合は列[age]に対して条件をつけて出力する。

import pandas as pd

def main():
    df = pd.read_csv('./files/test.csv', sep=',',header=0)
    print(df[['id','name', 'class', 'age', 'grade']]
          .query('age > 6'))

if __name__ == "__main__":
    main()
(.venv) MacBook-Pro:test1$ python3 read_csv.py 
   id             name    class  age  grade
1   2    yosuke tanaka  class-1   12      6
2   3  hiroshi suenaga  class-3    8      3

・CSV行の重複を削除する

次にCSVの行に重複を排除する関数について記載する

使用するCSVはこちら

id,name,class,age,grade
01,"kiyohiko kuroda","class-4",6,1
01,"kiyohiko kuroda","class-4",6,1
02,"yosuke tanaka","class-1",12,6
03,"hiroshi suenaga","class-3",8,3

下記の[unique]関数は特定の列を指定して一意にする機能がある

import pandas as pd

def main():
    df = pd.read_csv('./files/test.csv', sep=',',header=0)
    print(df['id'].unique())

if __name__ == "__main__":
    main()
(.venv) MacBook-Pro:test1$ python3 read_csv.py 
[1 2 3]

表示されたのは[id]列をユニークにした結果である。csvでは01が2件あるため、それを1件にまとめている。

次はレコードごと重複を削除する[drop_duplicates]関数である

import pandas as pd

def main():
    df = pd.read_csv('./files/test.csv', sep=',',header=0)
    print(df.drop_duplicates())

if __name__ == "__main__":
    main()
(.venv) MacBook-Pro:test1$ python3 read_csv.py 
   id             name    class  age  grade
0   1  kiyohiko kuroda  class-4    6      1
2   2    yosuke tanaka  class-1   12      6
3   3  hiroshi suenaga  class-3    8      3

・平均値、標準偏差などを求める

[describe]関数を使用すると下記の値を表示してくれます。

インデックス和名意味数値的意味合い
countカウント数各列の値の総数。つまりCSVファイルの各列の個数の総数になる。基本は正の数のみしか取らない。
mean算術平均各列の平均。各値の総和を個数で割った数。基本は正の数。特定のグループの値の大きさを知ることができる。
std標準偏差平均値からの離散具合。分散数の正の平方根基本は正の数。値が大きくなるにつれて平均からの離れ具合が大きい事を意味する。
min最小値各列で最も小さい値をとる数値正負のどちらもとりうる。各列の最も小さい値が表示される。
25%(1/4)分位数第一の四分位数(Q1)。
50%中央値中央値。中央に位置する数値二つの平均値をとる。基本は正の数。平均をとるので小数点以下数値が発生する。
75%(3/4)分位数第三の四分位数(Q3)。
max最大値各列で最も大きい値をとる数値。正負のどちらもとりうる。各列の最も大きい値が表示される。
import pandas as pd

def main():
    df = pd.read_csv('./files/test.csv', sep=',',header=0)
    print(df.describe())

if __name__ == "__main__":
    main()
(.venv) MacBook-Pro:test1$ python3 read_csv.py 
             id        age     grade
count  4.000000   4.000000  4.000000
mean   1.750000   8.000000  2.750000
std    0.957427   2.828427  2.362908
min    1.000000   6.000000  1.000000
25%    1.000000   6.000000  1.000000
50%    1.500000   7.000000  2.000000
75%    2.250000   9.000000  3.750000
max    3.000000  12.000000  6.000000

上の例を見ると、文字列である[name]は自動的に排除してくれています。

・Appendix

参考文献はこちら

https://hogetech.info/oss/pandas

https://qiita.com/ysdyt/items/9ccca82fc5b504e7913a

https://gmo-research.jp/research-column/standard-deviation

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*