4
3

More than 1 year has passed since last update.

CSVファイルを読み取ってPandasで編集してみた。

Last updated at Posted at 2022-11-03

はじめに

  • 以前、とあるサーバーからCSVファイルをAPIで取ってきて、編集したものを自分のサービスに読み込ませるというバッチを作成する機会がありました。そのときの実行ログとして残しておきたいと思います。
  • Webアプリ開発にしろ機械学習にしろ、CSVファイルを読み込んでそれに手を加えて使うというのは一緒だと思いました。他の人の役に立てば幸いです。

pandasのインストール

インストール
% pip install pandas
% pip list | grep pandas #バージョン
pandas             1.5.1

1. CSVファイルの読み取り

import pandas as pd

file = PATH #取得したいファイルのPATH
df = pd.read_csv(file, encoding = "utf-8") #encodingは案件によって変えてください

今回は適当にdfを作ります

df作成
df = pd.DataFrame({'name': ["tanaka taro", "yamamoto taro", "ota taro"], 'zipcode': ['111-1111', '222-2222', '333-3333'], 'school': ['新潟大', '新潟大', '千葉大']})
print(df)
#         name     zipcode     school
#0    tanaka taro  111-1111    新潟大
#1  yamamoto taro  222-2222    新潟大
#2       ota taro  333-3333    千葉大

2. 編集

2.1 一つの列を2つに分けたいとき。

ここでは、nameをfirstnameとlastnameに分ける処理を書きます。

df[["lastname","firstname"]] = df["name"].str.split(' ', expand=True)
print(df)

#        name         zipcode        school  lastname firstname
#0    tanaka taro  111-1111    新潟大    tanaka      taro
#1  yamamoto taro  222-2222    新潟大  yamamoto      taro
#2       ota taro  333-3333    千葉大       ota      taro

注意点としては、df[['column1','column2']]のようにリストの中にリストの形になっていることです。
リストが1つしかないと、一つのカラムを取り出している処理となり
raise ValueError( ValueError: Cannot set a DataFrame with multiple columns to the single column ('lastname', 'firstname')というエラーが発生するのでご注意を

今回は半角スペースで分けたかったのでstr.split(' ')としましたが、そこも分けたい文字によって変えてください。expand=Trueも必要なのでお忘れなく。

2.2 いらなくなった列を削除

2.1 で作ったdfの中にnameカラムがあります。これはもう使わないので削除しましょう

df.drop(columns='name', inplace=True)
print(df)

#    zipcode school  lastname firstname
#0  111-1111    新潟大    tanaka      taro
#1  222-2222    新潟大  yamamoto      taro
#2  333-3333    千葉大       ota      taro

inplace=Trueというのはdfに加えた変更を一時的ではなくする(対象を即時変更する)オプションです。

2.3 ある列から特定の文字を削除したい時

次は、カラムがzipcodeのものから"-"(ハイフン)を取り除く処理を行います。
これも列を指定し、replaceを使えば簡単にできます

df['zipcode'] = df['zipcode'].str.replace('-', '')
print(df)

#   zipcode school  lastname firstname
#0  1111111    新潟大    tanaka      taro
#1  2222222    新潟大  yamamoto      taro
#2  3333333    千葉大       ota      taro

2.4 ある列から重複しないように値を取り出す。

あるカラムが他のカラムと一対多の関係だったとします。いまの場合、name(名前)はどこかのschool(学校)に属しているような状態です。nameschoolに対して属しているので、schoolの列に複数同じ要素が現れることもあります。今の場合,新潟大が二回現れています。
そして、いわゆる親のような存在(ここではschool)に対して処理したい場合が存在します。その場合,重複されているとちょっと困るというときがあるので、ある列から重複していない値を取り出す方法を紹介します。

それがunique()です。pd.Series.unique()としてあげることで、その列から重複のないリストを取得することができます。

print(df["school"].unique())
#['新潟大' '千葉大']

これとitterrows()やitertuples()などと組み合わせれば、ユニークな値のみに対して処理を行うことができます。

最後にCSVで出力

最後に編集したCSVを出力して終了です。

df.to_csv(path,index=False) #pathは自分の保存したい場所に指定してください。

他にも色々な編集があると思います。とりあえず、自分が使ったものを紹介させてもらいました。

参考記事

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3