2019-05-08-公開 2019-05-10-更新
困りごと
- Pythonのpandasでデータフレームの値を変更しようとした際、代入できず困った
- pandasをソートして一番最初の行を取ってこようとした際、行番号ではなく行名?での指定が行われて困った
解決策
※1.の原因と対策は以下の記事を参照すればもうそれで十分とも言えるが… qiita.com
ここでは1, 2それぞれの困りごとに対する簡単な実験の結果と過程をメモしておく。
実験
実験過程は以下のjupyter notebookに記載しているので、以下では結論を。 github.com
dfの値の変更ルール(困り1)
- 「列(Series)を抽出->行を指定(スライシング)」で行う必要がある(先述の記事より)
- 「行指定 -> 列抽出」で処理が行われると値が変更されない
- ※値の変更先が数値だと後者でも変更できた -> 異なる型のデータの代入時にうまくいかない?
- pd.DataFrameはpd.Seriesが集まったものだから、最初にSeriesを取り出す必要があるため?
- 行・列の順番で、とはいえ以下の方法では列の指定でエラーが出る
df.loc[col][i] = 210
- 「行指定 -> 列抽出」で処理が行われると値が変更されない
値の指定方法
行名・列名で指定する場合(困り1)
- 上述のルールに従えば基本的に何でもよさそう
.at[i, col]
を使うとよさそう- 例:
df.at[i, col] = 223
.loc[]
より速いらしいので
- 例:
行の順番・列名で指定する場合(困り1, 2)
- 列抜き出し後、行の指定に
.iloc[i]
を使う- 例:
df[col].iloc[i] = 999
- それ以外の方法の多くはindexの指定になり、ソート前の行番号を指定してしまう(indexがデフォルトの連番の場合)
- 詳細は先述のjupyter notebook参照
- 例:
参考
感想
- 「指定の順番」「元の値の型」「使うメソッド」で挙動が変わるとは、つらい
- 長時間の処理が終わって結果が全部NaNだったときの悲しさ
精進せねば。

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney,瀬戸山雅人,小林儀匡,滝口開資
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/07/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る