Help us understand the problem. What is going on with this article?

Jupyter Notebook + Ruby で CSV を加工して出力する

More than 1 year has passed since last update.

この記事は?

Jupyter Notebook 上で CSV を読み込み、列と行を加工して、加工した CSV を出力する方法を記載します。Excel でやればいいとか、Jupyter Notebook 上でやるなら Pandas (Python) でやればいいとかそういう声もあると思います。ただ Jupyter Notebook 上で CSV を加工しながら最終結果を出力したい、かつ Python ではなく使いなれた Ruby でそれを行いたいということもあるかもしれません。

はじめに

Jupyter Notebook のインストール方法、ならびに Jupyter Notebook 上で Ruby を動かす方法については説明を省きます。後者は SciRuby/iruby の README.md が参考になります。

方法

まず Daru をインストールします。Daru は Python における Pandas にあたるデータ分析用のライブラリで、これを使えば CSV を DataFrame という形式で読み込んで加工することができます。

$ gem install daru

ちなみに、これから記載する Ruby コードは全て Jupyter Notebook 上で実行してください。

require 'daru'

今回は例として 男女別人口-全国,都道府県 (大正9年~平成27年) というデータセットの CSV を使います。

CSV は上記のリンク先からダウンロードします。

01.png

あるいは次のコードでダウンロードします。

# CSV をダウンロードする。
require 'open-uri'

url = 'https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031524010&fileKind=1'
open(url) do |f|
  File.open(File.expand_path('~/Downloads/c01.csv'), 'wb') do |out|
    out.write(f.read)
  end
end

このままではこの CSV を Daru で扱えません。扱えるようにするには文字コードを変換して、かつ不正な行を取り除きます。

# CSV の文字コードを Shift_JIS から UTF-8 に変換する。また、不正な行を取り除く。
File.open(File.expand_path('~/Downloads/c01.csv'), 'rb:Shift_JIS:UTF-8', undef: :replace) do |f|
  CSV.open(File.expand_path('~/Downloads/c01_utf8.csv'),'w') do |csv|
    CSV.new(f).each do |row|
      # 末尾にコメントが 2 行あるのでそれを取り除く。
      next unless row.length == 9

      csv << row
    end
  end
end

これで Daru を使って CSV を読み込むことができます。

df1 = Daru::DataFrame.from_csv(File.expand_path('~/Downloads/c01_utf8.csv'))

Ruby のコードを実行すると、Jupyter Notebook 上に DataFrame の中身が出力されます。

02.png

末尾は以下のとおりです。

03.png

まず列を加工してみましょう。

# 列を都道府県コード, '西暦 (年),  人口 (総数) だけに絞り込む。
df2 = df1['都道府県コード', '西暦(年)', '人口(総数)']

04.png

次に行を加工してみます。

# 西暦 (年) が 2,000 以上の行だけに絞り込む。
df3 = df2.where(df2['西暦(年)'].gteq(2000))

05.png

最後に、加工した DataFrame を CSV に出力します。

df3.write_csv(File.expand_path('~/Downloads/c01_utf8_updated.csv'))

これで完了です :tada:

最後に

もちろん Excel でも CSV の加工は可能ですが、Jupyter Notebook 上で対話的にデータをいじりながら加工できるのは便利です :blush:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした