はじめに
今回は、Pythonで読み込んだCSVファイルから、特定の位置(index:0, column:0)にあるデータをピンポイントで取得する方法について学びました。
使用環境は以下のとおりです。
- PC: MacBook Air (11-inch, Early 2015)
- OS: macOS バージョン11.6(20G165)
- Pythonバージョン: 3.8.8(64-bit)
背景
CSVファイルを正しく読み込めるようになったため、
今度は、行や列単位ではなく、特定のセルの値を直接取得したいと考えました。
実際に行ったコマンド
df.iat[0, 0]
df
は、読み込んだデータフレームです。iat[行番号, 列番号]
は、インデックス番号を使って直接セルの値を取得できる便利なプロパティです。
この方法で、無事にindex:0、column:0の位置にあるデータを取得することができました。
思考の流れ
① Excelのセル指定のような方法を探した
最初は、Excelのように**「A1」や「B2」**のような形式で指定できないかと考えました。
しかし、標準のpandasでは、セル番地のような直接指定の仕組みは存在しないことがわかりました。
(※ライブラリを拡張すれば可能な場合もありますが、今回はpandas標準機能で解決を目指しました。)
② 行単位で取得しようと試みた
次に、csv
モジュールを使って、行単位でデータを取得しようと考えました。
with open('example.csv', 'r') as f:
reader = csv.reader(f)
line = [row for row in reader]
これで行ごとにリスト化できたものの、列指定が思ったより直感的ではなく、
「やはりpandasで完結させたい」と感じました。
③ ilocを使う案を一旦見送り
さらに、iloc
を使って特定位置を削る(スライスする)方法も考えましたが、
最近同様の操作を多用していたため、今回は別の手段を模索することにしました。
④ 最終的にiatにたどり着く
調べた結果、**iat
**というプロパティがあることを知りました。
iat[行番号, 列番号]
:インデックスベースで位置を指定at[行ラベル, 列ラベル]
:ラベル名ベースで位置を指定
このうち、今回のように**「位置(番号)指定で取りたい」**ケースでは、iat
が最適だと判断しました。
ポイント整理
プロパティ | 特徴 | 例 |
---|---|---|
iat | 行番号・列番号でセルを指定する | df.iat[0, 0] |
at | 行ラベル・列ラベルでセルを指定する | df.at[行ラベル, 列名] |
まとめ
- ピンポイントでセルの値を取得したいときは、
iat[行番号, 列番号]
が便利。 - Excelの「A1」形式の指定はpandas標準には存在しないが、番号ベースで柔軟に取得できる。
- 行ラベルや列ラベルを使いたい場合は、
at
を使用するとよい。
今回の学習を通じて、データフレームの中身に柔軟にアクセスするテクニックがさらに深まりました。
今後も、状況に応じてiat
とat
を使い分けられるように、経験を重ねていきたいと考えています。