【Python/pandas】社内のexcelファイルをcsvにしてpythonで扱う

Python

みなさんこんにちは!ほぬです!

前回の記事で、「パイソンをインストールするところを思い出しながら記事にします!」と言ったが、あれは嘘だ。

連載形式にするより、今リアルに困っていることとか解決したことをリアルタイムで記載するほうがいいかと思いまして。。。

さて、みなさん、プログラマを目指している方でなくて、pythonの勉強してみようかなという方の多くは、「今までの作業を効率化・高度化したい」という目的が多いのではないでしょうか。

私もガッツリそういうタイプです!

今回はそんな方のために、そもそも今まで社内で扱っていたExcelファイルを、どうにかpythonにぶちこんで、扱いやすいようにする簡単なやり方をご紹介します!

そもそも私はこちらの記事で勉強させていただきました(ありがとうございます)。
が、私が詰まったところや、大盛りすぎてとりあえずいいかなと思った部分を捨象して、他のサイト等も参考にしつつ、ほんとにとりあえずexcelデータを取り込んで成形するところだけに絞ってみました。

参考サイト:データ分析で頻出のPandas基本操作

※2020/1/11 一部修正

元のファイルと目指したいこと・・・

今回、このようなexcelファイルを用意しました。
すごく、ありそうなファイルですよね。日本語の文字列あり、数字あり、パーセントあり、空白あり、日付あり。。。

データの大元は東京証券取引所のコーポレートガバナンス情報サービスです。
え?どうやって作ったかって?頑張って手作業でつくってるんだよ!そこの自動化はいつかやりたいよ!

今回はこのexcelをcsvにして、pythonでとりこんで、扱いやすいように成形することを目指します。

Excelをcsvにして保存しよう

プログラミングをやり始めると当然のように出てくるのが、「csvファイル」です。

ExcelのVBAマクロ等を使ったことがある方ならご存知かもしれないですし、そうでない方も存在ぐらいは知っているかもしれないですね。

あの、excelに似て非なるファイルです。カンマ”,”で区切ってあるやつですね。

プログラミングを始めるにあたってとりあえずcsvファイルを用意する必要があるのですが、これは簡単です。

使いたいexcelファイルを開いて、「名前を付けて保存」してください。その際に、普段はあまり意識していないかもしれませんが、保存する形式を選ぶことができます。デフォルトだとそのまま.xlsxで保存する形式になっているのではないでしょうか?

そこのタブをクリックして、CSV(カンマ区切り)(*.csv) を選んで保存します。

これでお目当てのcsvファイルが完成です。保存先はpythonの作業をやっているフォルダに保存すると、呼び出すときに楽です。今回私はgovernancedata20200105.csvという名前で保存しておきました。

ここで注意してほしいのが、csvファイルにする際は1シート目しか保存されないので、複数シートに分かれたexcelファイルを扱う際は、それぞれ別のcsvファイルとして保存する必要があります。

csvファイルをpythonで開こう

それでは、pythonで開いていきましょう!
私はAnacondaでJupytar.Labを使っています(その辺はまた今度書きます)。
ちょっと時間がないので今日のところは丸ごと貼っておきます。。。
別途説明が必要そうだったら改めて書きます。。。

そもそもの下準備として、パンダとナンパイを導入する
import pandas as pd
import numpy as np

さっきのcsvファイルを読ませる。
df = pd.read_csv(‘./governancedata20200105.csv’, sep =’,’, encoding =’cp932′)
df.head()

一番左のIndexいらないので消そう

一番左の行番号いらないので、codeをキー(index)にする
df.set_index(‘code’, inplace=True)
df.head()

空白セルは後々面倒なので探して埋めよう

空白セルを見つける
df.isnull().sum()
↓図だと、supervisor 1087とでてますが、これは「suervisor列に1087個の空白セルがあるよ!という意味です。」

空白セルを埋める。

※2020/1/11 一部修正しました!
すいません3行目を%に変換しておかないとこの後の挙動がおかしくなっちゃってました!
df.fillna(value={‘supervisor’: 0}, inplace=True)
df.fillna(value={‘outside_sv’: 0}, inplace=True)
df.fillna(value={‘outside_sv_ratio’: ‘0.0%’}, inplace=True)
df.isnull().sum()

データの型を確認する

空白がなくなったので、今度はそれぞれの列のデータの型を確認する
print(df.dtypes)

望ましい型に変換する

supervisorとoutside_svは人数なので整数(int)でほしいんです。今だと小数点数値(float)になっている。
ratioの列は小数点の数値(float)でほしいんですよ。今だと○○%という文字列混じり(object)になっちゃってるんです。
df[‘supervisor’] = df[‘supervisor’].astype(int)
df[‘outside_sv’] = df[‘outside_sv’].astype(int)
df[‘outside_dr_ratio’] = df[‘outside_dr_ratio’].str.replace(‘%’, ”).astype(float) /100
df[‘outside_sv_ratio’] = df[‘outside_sv_ratio’].str.replace(‘%’, ”).astype(float) /100
df[‘top_holdings’] = df[‘top_holdings’].str.replace(‘%’, ”).astype(float) /100
print(df.dtypes)
df.head()

成形済みのものを別のcsvファイルに保存する

これでデータの成形が済んだので、できた新しい配列をcsvに保存する
df.to_csv(‘./governancedata20200105_2.csv’, encoding=’utf-8′)

encodingのところに注目です。文字のコードなのですが、最初に読み込ませたときは、cp932でした。これはexcelから冒頭の名前を付けて保存→csvでやるとcp932になってしまうようで、encoding = ‘cp932’と指定しておかないとエラーを吐きます。

今回はcsvとして、今後もpythonで扱うことを念頭に置いて保存するので、encoding = ‘utf-8’にしてあげましょう。utf-8だと、次回以降呼び出すときはencodingの指定をしなくてよくなったりと、便利です。

今保存したファイルを再度読み込もうと思ったら、↓ですね。
df = pd.read_csv(“./governancedata20200105.csv”, sep =”,”)

完成物をpython上で眺めよう

最後に、保存したファイルをpython上で開いて眺めてみましょう。
ちなみに最初のcsvファイルの段階ではさっきの文字コードが原因で、python上でひらくことすらできません。。。

以上、ざーっと書いてみました、まだまだ改良の余地はありそうですが、既存のexcelをぶちこむときに今後使い勝手が良さそうです!
完成物でoutside_dr_ratioが99999999999とかなっているのが不満ですね。四捨五入とかさせたほうがよさそうだ。
それから、今日は一番右端の日付列をいじっていないので、これたぶん文字列になっているはずです。そこもいじりたいですね。。。

ほぬ

コメント

タイトルとURLをコピーしました