探索ブログ

日々の生活が少しだけ効率的になる方法、少しだけ得する方法を紹介する雑記ブログです。

Pythonで最低限覚えるべき事項をまとめてみた

f:id:koichicom:20190325181957p:plain
以下は、Pythonを初めて学習したときに、最低限覚えておくべき事項をまとめました。

アプリ開発等で「あれ?どうやって書くんだっけ?」となったときに、参考にしてもらえればと思います。

中身としては、Numpy、Pandas、matplotlibも最低限覚えておくべきと考え記載しています。

 

Pythonの基礎

計算

整数に変換して計算する。

"1" + 2 + '3'

 int("1")+2+int('3')

 

関数

2つの引数を取り合計を返す関数
def func(x,y):
return x + y
func(1,2)
整数を引数に取り、100以上の場合はTrueを、それ以外の場合はFalseを返す関数
def func(n):
return n >= 100
func(90)
lambda式の書き方
def func(引数):
    return 返り値

lambda n: n * 2

となる。

リスト

リストの作成と要素の切り出し

0から4までのリストを作成

lis = [0,1,2,3,4] #パターン①
lis = list(range(5)) #パターン②
lis
[0, 1, 2, 3, 4]

2番目と3番目の要素を切り出す場合

lis[1:3]
//後ろから二つ目の要素を切り出す場合
lis[-2:]
要素数の表示

リストを作成し、リストの要素数を表示させる

lis = [0,1,2,3,4]
len(lis)
5
リストの合計値
sum(lis)
enumerateによりIndexを付けることが可能
for i,name in enumerate(lis):
    print(i,name)

Zipを使うと要素を二つ同時にfor文で回すことが出来る。

names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]

for name, age in zip(names, ages):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18
昇順、降順への並び替え
lis = [0,1,2,3,4,5]
lis.sort(reverse=True)
lis
[5, 4, 3, 2, 1, 0]
//lis.sort()では、初期値として昇順となる。
リストから条件を満たすだけのリストを抽出する(関数作成)

整数と整数の文字列の混じる要素のリストを与えると、文字列を取り除いたリストを返す関数

def func(lis):
    ret = []
    for x in lis:
        if isinstance(x,str):
            continue
        ret.append(x)
    return ret
    
lis = ["1",2,'3']
func(lis)
[2]
リスト内包表記でやってみる
def func(lis):
    return [x for x in lis if not isinstance(x, str)]
lis = ["1",2,'3']
func(lis)

辞書型

for文でのディクトの作り方
lis = list(range(1,4))
dic = {}
for n in lis:
    dic[n]=n *2
dic
ディクトの作成方法と要素の切り出し
dic = {"A":1,"B":2,"C":3}
for key,value in dic.items():
    print(key,value)

A 1
B 2
C 3
//dicだけの場合
dic
{'A': 1, 'B': 2, 'C': 3}
//for分で回さない場合、以下のprint分で各要素が表示できる。
print(dic.items())
dict_items([('A', 1), ('B', 2), ('C', 3)])

クラス

簡単なクラスの作成例
class TEST: 
    
    def __init__(self, aaa, bbb): 
        self.aaa = aaa
        self.bbb = bbb
        
    def test_aaa(self): 
        print(self.aaa)
        
    def test_bbb(self):
        print(self.bbb)
        
    def test_ccc(self): 
         print(self.aaa+ self.bbb)
         print("一つ目の引数は{0}、二つ目の引数は{1}です。".format(self.aaa,self.bbb))
            
VM = TEST("あああ","いいい") #インスタンス生成
VM.test_aaa() #メゾット呼び出し
VM.test_bbb() #メゾット呼び出し
VM.test_ccc() #メゾット呼び出し

あああ
いいい
あああいいい
例2
class Ca:
    
    def p(self,x,y):
        print( x + y)
        
    def t(self,lis):
        print(sum(lis))
        
test = Ca()
test.p(1,2)
test.total([5,4,3,2,1])

Numpy

大前提

Numpyの読み込みを行う

 import numpy as np 

配列

二次元配列の作成方法

1,2,4
8,16,32

array = np.array([[1,2,4],[8,16,32]])
print(array)
[[ 1  2  4]
 [ 8 16 32]]
行列の変換方法

1,2,3,4,5,6の配列を作り、6行1列に変換

array = np.array([1,2,3,4,5,6]).reshape(6,1)
print(array)
何行何列か調べる方法
array = np.array([[1,2,4],[8,16,32]])
print(array.shape)
print(array.ndim) #次元数
print(array.size) #要素数
(2, 3)

配列の作成・結合・編集

乱数配列の作成方法

3行4列の0-1の乱数の配列作成

array = np.random.rand(3, 4)
print(array)
[[0.88773009 0.83967934 0.37861678 0.63181225]
 [0.73038421 0.24665673 0.28851812 0.86733139]
 [0.60382702 0.79182331 0.67715485 0.2144135 ]]
配列の結合方法
array_1 = np.array([1,2,4])
array_2 = np.array([8,16,32])
array_3 = np.append(array_1,array_2).reshape(2,3)
print(array_3)
[[ 1  2  4]
 [ 8 16 32]]
配列の要素抽出

2次元配列を作り、3行1-2列の要素切り出し
1,2,3
4,5,6
7,8,9

array_1 = np.arange(1,10).reshape(3,3)
print(array_1[2,:2])
[7 8]

演算

行列の四則演算

ブロードキャストあり
3(1 2 3 −2(1 2 3
4 5 6) 1 2 3)

(3*np.arange(1,7).reshape(2,3))-(2*np.arange(1,4))
array([[ 1,  2,  3],
       [10, 11, 12]])
内積

(1 2 3 * (1 2
4 5 6) 34
56)

array_1 = np.arange(1,7).reshape(2,3)
array_2 = array_1.reshape(3,2)
print(array_2)
print(np.dot(array_1,array_2))
[[1 2]
 [3 4]
 [5 6]]
[[22 28]
 [49 64]]

処理

行方向と列方向の処理

2次元配列をそれぞれ行方向と列方向に合計した1次元配列
(1 2 3
4 5 6)

array_1 = np.arange(1,7).reshape(2,3)
array_2 = np.sum(array_1, axis = 0) #axis = 0が列方向
print(array_2)

array_3 = np.sum(array_1, axis = 1) #axis = 1が行方向
print(array_3)
[5 7 9]
[ 6 15]

Pandas

大前提

Pandasの読み込みを行う

import pandas as pd
csvファイルをデータフレームに格納
df = pd.read_csv("../〇〇〇/〇〇〇/〇〇〇.csv", sep=",") #.が一つで現在の場所。一つ上は[..]で表す
CSVを読み込んだデータフレームを初期化する関数
def get_df():#関数を作成
    return pd.read_csv("../〇〇〇/〇〇〇/〇〇〇.csv", sep=",") #関数の中身としてcsvの読み込みを実施
df = get_df()#関数を実行
データフレーム行数と列数を確認する
row_num, col_num = df.shape#df.shapeにて行数と列数を取得できる。これはこれ専用の書き方。row_nomやcol_numはrowやcolで出力可能。下記参照
print("行数:" + str(row_num))
print("列数:" + str(col_num))
行数:4119
列数:21

print(df.shape)#これでもOK
# (891, 12)

row, col = df.shape#こちらでもOK
print(row)
print(col)
# 891
# 12
データフレームの操作

•loc: セルのラベルを指定。すなわち、[:4]と記載したら、0~4の計5個を読み込む
•iloc: セルの行番号・列番号を指定。すなわち、[:4]と記載したら、0~3までの計四個を読み込む

データの切り出し例

dfの2〜4行と1〜3列を切り出し

df.iloc[1:4,:3]#ilocが行列の位置で指定。
df.iloc[- 1, - 1]#最終行の書き出しはこれで行う
df.iloc[df.shape[0] - 1, df.shape[1] - 1]
♯最後の行はサイズの数字を入れればよい。
#サイズはshapeで出せる。0は行。1は列
#最後にマイナス1なのは、住所がゼロから始まるため。
df.loc[:,["job","age"]]#locで列名を指定する。行数していがないため、:で全部を指定する。

#列名で切り出しの二つのパターン
#シリーズとして切り出し
df.["job"]
#データフレームとして切り出し
df.[["job"]]
条件を満たす切り出しを行う場合
df[(df["age"] <= 20) & (df["Yes or No"] == "yes")]#dfの中()でくくり、その中に、条件式を入れていく。
#orは縦棒”|"
不要データの処理

欠損への書き換えと、欠損したセルをすべて表示させる。

import numpy as np
df[df == "yes"] = np.nan#numpyのNULLを利用してYESをunknownに書き換え。
df.fillna("0") #欠損値を0で書き換える

欠損地があるかどうか確認する。

df.isnull().any()#列ごとに欠損がある場合Trueが返される。any(axis = 1)とすれは行方向の確認

df.dropna()#欠損がある行を削除する。(axis = 1)とすれば列が削除される。

重複処理

df.drop_duplicates("XX")#重複行削除はこのやり方として覚える。
集計と集約及び変更

列名の変更

df.rename(columns={"AAA":"BBB"})

集約と平均
groupbyによる集約。各項目AごとBごとの平均Yを算出

df[["A", "Y", "B"]].groupby(["A","B"]).mean()

型の変更
A列をfloat型に変更する。

df["A"] = df["A"].astype(float)
df.head()

ソート
A列で降順にソートしたデータフレームを表示

df.sort_values("AAA", ascending=False)#, ascending=Falseで降順が可能となる

データフレームの作成
XX、YY
1,2
3,4
5,6

new_df = pd.DataFrame(data=[[1,2],[3,4],[5,6]], columns=["XX","YY"])
new_df
連結処理

横結合merge
新しいデータフレームを作り、もともと存在するデータフレームとXX列でmergeせよ。

new_df = pd.DataFrame(data=[[1,2],[3,4],[5,6]], columns=["XX","YY"])
df.merge(new_df, on="XX")#, how='inner'が無いが、省略時は自動的に内部結合となる。

縦結合append
新しいデータフレームをもともと存在するデータフレームに行を追加する

df.append(new_df, ignore_index=True)

matplotlib

大前提

import matplotlib.pyplot as plt
%matplotlib inline #plt.show()が無くても図を表示してくれる。
可視化の種類

折れ線グラフ
①XとYを折れ線グラフに表示する。
②x軸に「time」、y軸に「count」を表示。
③マーカーをつける。
④タイトルを「TEST」
⑤グリッド線も表示させる。
X = [9, 8, 7, 6 ,5, 4]
Y = [13, 23, 20, 19, 10]

X = [1, 2, 3, 4 ,5, 6]
Y = [13, 23, 20, 19, 10, 11]
plt.plot(X, Y, marker="o")
plt.xlabel("time")
plt.ylabel("count")
plt.title("TEST")
plt.grid()
plt.show()

折れ線グラフに変数名を凡例をつける場合。

X = [1, 2, 3, 4, 5]
ZZZ = [3, 1, 2, 2, 3]
GGG = [3, 5, 1, 6, 6]
plt.plot(X, ZZZ, label="ZZZ")
plt.plot(X, GGG, label="GGG")
plt.legend(loc="upper left")
plt.show()

棒グラフ
横軸のティックラベルを指定する
tick_label = ["A君", "B君", "C君", "D君", "E君"]
data = [10, 13, 9, 6, 10]

tick_label = ["A君", "B君", "C君", "D君", "E君"]
data = [10, 13, 9, 6, 10]
plt.bar(tick_label, data)
plt.show()

散布図

ABS_X = [1, 3, 2, 4, 6]
ABS_Y = [29, 31, 22, 43, 26]
ZZ_X = [4, 1, 1, 3, 2]
ZZ_Y = [22, 32, 12, 33, 36]
plt.scatter(ABS_X, ABS_Y, label="ABS")
plt.scatter(ZZ_X, ZZ_Y, label="ZZ")
plt.legend()
plt.show()

#スキャッターパラメータの例:plt.scatter(X, Y, marker="x", color="green", alpha=0.1)
#乱数発生の例:X, Y = np.random.rand(100), np.random.rand(100) 

ヒストグラム
0-1までの値をとるランダムな小数を1000個ヒストグラムにせよ。
また、バーの数は20本、線の太さは0.7、y軸のラベルに「count」と表示せよ。

import numpy as np
x = np.random.rand(1000)
plt.hist(x, bins=20, rwidth=0.7) #通常は幅は1.0
plt.ylabel("count")
plt.show()

以上が最低限覚えるべき事項と考える。
間違っているもがあれば指摘いただけると助かります。