Python Tips

pythonを利用する上で、便利な表記などの個人的なメモです。基本的な部分は触れていません。対象も自分が便利だなと思ったものに限定されます。

github

  • githubのjupyter notebook形式のファイルはこちら

google colaboratory

  • google colaboratory で実行する場合はこちら

筆者の環境

!sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G95
!python -V
Python 3.5.5 :: Anaconda, Inc.
%matplotlib inline
%config InlineBackend.figure_format = 'svg'

import time
import json

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

import japanize_matplotlib

pandasでカラムを追加したときの注意点

あるnan入りのDataFrameに対して、それをdropした後、Series型のカラムを追加しようとしたとき、想定通りに動かず、数時間潰してしまった。

a = pd.DataFrame({
  'a': [1,2,3],
  'b': [1,np.nan,3],
  'c': [1,2,3],
})

a = a.dropna(subset=['b'])
a['d'] = pd.Series([1,33])
a
abcd
011.011.0
233.03NaN

$d$の2番目のデータに33が入っている想定だったが、nanが入っている。

インデックスをリセットしなければならないという事に気付くのに、数時間かかった。


a = pd.DataFrame({
  'a': [1,2,3],
  'b': [1,np.nan,3],
  'c': [1,2,3],
})

a = a.dropna(subset=['b']).reset_index()
a['d'] = pd.Series([1,33])
a
indexabcd
0011.011
1233.0333

となり、想定通りに新しいカラムを追加することができた。

実験的に最初の$a$に適当な数字でインデックスをつけて見ると、全く今まで想定しなかったカラムの追加がされていた。

a = pd.DataFrame({
  'a': [1,2,3],
  'b': [1,np.nan,3],
  'c': [1,2,3],
},index=[12,24,36])

# a = a.dropna(subset=['b']).reset_index()
a = a.dropna(subset=['b'])
a['d'] = pd.Series([1,33])
a
abcd
1211.01NaN
3633.03NaN

以下の様に新規のカラムを追加する際、暗黙的にインデックスが0から張られてしまうのだと思う。

a['d'] = pd.Series([1,33])

いままでこの事を意識することなくカラムを追加してきたが、特に問題なかったように記憶している。単純にdropnaなどをせず、インデックスが0から順番に整数で貼られていたからだと思われる。

pandasに詳しい人なら当たり前の事かもしれないが、かなり時間を取られたので、メモ。