StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

Pythonでよく忘れる、よく間違える書き方

  • Pandasのデータフレームは、=でコピーしようとすると、コピーじゃなくて参照渡しになるので、コピーしたつもりのdfを処理すると元のdfも処理されてしまう。df2 = df1.copy()とするのを忘れないように。
  • Pandasで要素がNaNかどうかを判定させようとする時、要素を指定してその後ろに.isnull()メソッドを使うんじゃなくて、データフレームに.isnull()を実行してそのあとで要素を指定する。
df.isnull().iloc[1,1]
  • リストのappendは、直接編集するメソッドなので、=で代入しなおさなくてよい。(リンク
  • リストをソートする時も、.sort()をつけるだけで、代入はしなおさなくてよい。
  • Pandasから.to_csvするとき、「quoting=csv.QUOTE_NONNUMERIC」という引数をつけると文字列のフィールドは""をつけることができるが、これは事前にimport csvしてないといけない。
  • リストの要素を置換する時、置換対照表を辞書にしておいて内包表記を使うと簡単にかけたりする。
X = ['あ','い','あ','あ','う','え','お','あ']
Y = {'あ':'ア','お':'オ'}
X2 = [Y[x] if x in Y.keys() else x for x in X]
print(X2)
  • listをユニークにするには、NumPyなら.unique()が使えるが、setにしてからlistに戻せばユニークにはなる。順序は崩れるので注意。
unique_list = list(set(original_list))
  • 数値をゼロ埋め(ゼロパディング)した文字列がほしい時は、数字を文字列にしてから、たとえば.zfill(3)とつけるとゼロ埋め3桁の数字(文字列だけど)になる。
  • Rばかりやってると間違えるのだが、Pythonでは代入はオブジェクトのコピーを意味せず、名前が増えるだけとなる。つまり、代入した先の変数名に対して編集すると、元のオブジェクトが編集されてしまう。
x1 = [1,2,3,4,5]
x2 = x1
x2.remove(3)
print(x1)
print(x2)
[1, 2, 4, 5]
[1, 2, 4, 5]
  • andとorを組み合わせると、andが優先(先にくくられる)なので、A and B or C and Dだと(A and B) or (C and D)の意味になる。明示的に優先させたければ()でくくる。
  • nanとnanは==マッチしないので、nanかどうか判定するにはmath.isnan()を使う必要がある。
  • object型の列は、中に複数種類のデータ型が含まれている可能性がある。特に、pandasで文字列型の列を読み込むとobject型になるが、nanを含んでいる場合、そのnanが別の型になってたりとか。
  • torch.tensorの次元や長さについて。
# 次元数の確認(何重の入れ子になってるか)
x.dim()
x.ndimension()
x.ndim

# 各次元ごとのサイズを確認(外側の次元から順番に要素数が表示される)
x.size()  # numpy.arrayだとこれでバラしたときの要素数が返る?ので注意
x.shape

# 要素数(次元をバラしたときの要素数)
x.numel()
x.nelement()
  • 文字列の出力を、下に並べていくんじゃなくて上書きさせたいときは、キャリッジ・リターンで先頭に戻す動きをすればよい。(前の出力のほうが長くてケツのほうが残ったりするのを避けるには、スペースで埋める。)
for i in range(100):
    print(f'{i}週目です', end='\r')
    time.sleep(5)
  • データフレームを複数の条件でソートするとき、Rと違って、高階層側(外側)の条件を先に書く。以下のようにすると、全体としてはmatch_id順に並んでいて、同じmatch_idの中でplayer名順に並ぶようになる。Rとかエクセルだと内側から先にソートするので注意。
d2 = d2.sort_values(by=['match_id','player'], ascending=True)
  • pandasのデータフレームをソートしたあと、reset_index(drop=True)しておかないと、順番は代わってるのにインデックスのラベルはもとのままになっているので、あとでおかしなことになる。
d2 = d2.sort_values(by=['match_id','player'], ascending=True)
d2 = d2.reset_index(drop=True)