データエンジニアのものこと

2年目のデータエンジニアです。技術系のことや買ったものの感想などをネタにします。

PythonでCSVデータを扱うために必要な操作

はじめに

日本で働く多くの人はExcelCSVファイルを扱うことが多いのではないでしょうか。私もデータを扱うときの多くはCSVファイルを介してデータベース(DB)に放り込んだりすることが多いです。データ基盤で扱うデータはDBから直接取りに行ってBIツールで編集なんてことがありますが、その環境が整っていない場合はシステムからCSVファイルを出力、そのファイルとExcelで編集して分析することが多いのではないでしょうか。しかし、それを続けることによって以下の弊害が生じることがあります。

  • 分析の結果は出るが途中で何をやっているのか分からなくなる(ブラックボックス化)
  • データが溜まりExcelが鬼のように重い(最悪PCの再起動が必要になる)
  • 分析をおこなうまでのExcelでの編集が大変

などなど、これらの問題に直面しているExcel戦士の方も多いのではないでしょうか。現に私の職場でも多くのExcel戦士がいます。今回の記事は簡単な処理にPythonを利用して、少しだけでもそのExcel戦士たちの手助けになればいいと思っています。簡単な処理の繰り返し、行列の挿入・削除、データの変換などありがちな操作を簡易化して記述します。

注意

ここでPythonを利用してデータ変換をおこないますが、業務などで利用する際は必ずIT部門の指示にしたがってください。野良マクロならぬ、野良Pythonを増やすことはおすすめしません。

データの編集での困りごと

データ分析ができる状態にするまでかなりの手数かつ量をこなす必要が出ると思わず、やりたくないとつぶやいてしまいます。

  • 繰り返しの処理
  • 商品コードやIDなどの変換
  • 打ち間違いの発見

これらの作業を100行、10個のファイルを人力でとなると結構しんどいです。これ月次でおこなうなんて考えるなんてもってのほかです。これらを自動化できれば楽なのですが、完全に自動化するにはやはりプロの手が必要になります。完全にではなくても半自動化まで自分の手でできれば楽になります。

いざ、データの操作

import pandas as pd

データを扱う上で必要なモジュールをimportします。各ドキュメントを置いておきます。ここではpandasを使用します。

処理

ファイルを読み込む

.read_csv()を使用して、CSVファイルを読み込みます。

df = pd.read_csv('C:\\Users\\User_name\\folder_name\\file_name.csv')
df.head()

よくハマるのが()内のファイルの指定です。雑な回避策ですが、\のところを\にしてエスケープしておくと大体解決できます。1行目でデータフレーム(df)の読み込み、2行目で読み込んだdfを表示しています。2行目はあってもなくてもどちらでも問題ありません。

商品ID 商品名 価格 在庫数
001 キーボード 10000 50
002 マウス 5000 30
003 モニター 20000 20
004 ノートパソコン 80000 10
005 スマートフォン 60000 40

上記のテーブルを例にデータを操作していきます。

データを指定する

at, iat, loc, ilocを使用します。

  • at, locでの分類

    • at, iat:単独の要素を指定
    • loc, iloc:複数の要素を指定
  • iでの分類

    • at, loc:行名、列名で指定
    • iat, iloc:行番号、列番号で指定

私は基本的にilocを利用します。理由は以下の通りです。

  • forを利用するときに番号で指定する。
  • データソースの列名が変更になっている可能性があるため、列名ではなく番号で指定する。
  • 要素を複数または単数で指定できるのでlocを使用している。
#1列目を指定する
df_iloc = df.iloc[1]
print(df_iloc)
商品ID 商品名 価格 在庫数
002 マウス 5000 30

以上の結果がdf_ilocに指定されます。at, locを使用して自分のイメージ通りにデータを指定できるようになればpandasでのデータ編集も慣れてくると思います。

以下、参考使用です。公式ドキュメントではありませんがいつも参考にしているサイトです。記事中に公式ドキュメントのリンクもあるのでそちらも参照してください。

for, ifとの組み合わせ

上記のコードでデータを指定したところで、だから何だというのか私の正直な感想です。ここからfor文などと組み合わせていきます。行数を取得してその行数分の指定の列のデータを取得します。

row = len(df)
col = 1
for i in range(row):
    df_iloc = df.iloc[i, col]
    print(df_iloc)
  • row:行数
    dfの長さを取っています。これでデータ列数が変わっても列数分だけ処理を実行することができます。
  • col:列数
    ここでは1を指定していますが、ここも目的に沿って指定してください。
商品名
キーボード
マウス
モニター
ノートパソコン
スマートフォン

あとはfor文の繰り返し数や処理の内容を変更したりすることで自由な処理を記述できます。指定のデータのみを編集したいなどがあればif文で条件を指定します。ここまでイメージできればかなり自由に感じないでしょうか。

データを編集する

データの編集は簡単です。locなどでデータを指定してあげてそこに代入する値を与えてあげます。

df.iloc[1] = 0
print(df)
商品ID 商品名 価格 在庫数
001 キーボード 10000 50
0 0 0 0
003 モニター 20000 20
004 ノートパソコン 80000 10
005 スマートフォン 60000 40

ilocで指定した1行目の値が全て0になりました。先ほどのfor文の中身をこのデータを編集する処理に変更すれば一括でデータを編集することができます。さらにif文で条件指定して指定したデータのみを一括で変更することができます。だんだんなんでもできるような気がしてきませんか。このように条件と繰り返しと処理で自分のやりたい操作を表現していきます。

あとは応用の世界

これらの方法でデータを扱うことができれば、次のステップは自分のデータと向かい合ってどのような処理が必要になるのかを考えるだけです。だけと言いつつも、この点が一番難しく(想定外の動きをしたり、自分のロジックが間違っていたり)、一番面白いところであると私は思います。データの動きとプログラムの振る舞いに向き合う時間が好きです。

あとがき

ここでは一部の簡単な処理を紹介しましたが、私が初めの頃に悩んだ点を思い出しました。こういう記事で紹介されている処理をどのような環境で実行するのか、すぐに結果がわかるような環境がほしかったことがあります。いつかそんなことを書いていこかなと思います。