[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
コメントを残す