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
a | b | c | d | |
---|---|---|---|---|
0 | 1 | 1.0 | 1 | 1.0 |
2 | 3 | 3.0 | 3 | NaN |
$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
index | a | b | c | d | |
---|---|---|---|---|---|
0 | 0 | 1 | 1.0 | 1 | 1 |
1 | 2 | 3 | 3.0 | 3 | 33 |
となり、想定通りに新しいカラムを追加することができた。
実験的に最初の$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
a | b | c | d | |
---|---|---|---|---|
12 | 1 | 1.0 | 1 | NaN |
36 | 3 | 3.0 | 3 | NaN |
以下の様に新規のカラムを追加する際、暗黙的にインデックスが0から張られてしまうのだと思う。
a['d'] = pd.Series([1,33])
いままでこの事を意識することなくカラムを追加してきたが、特に問題なかったように記憶している。単純にdropnaなどをせず、インデックスが0から順番に整数で貼られていたからだと思われる。
pandasに詳しい人なら当たり前の事かもしれないが、かなり時間を取られたので、メモ。