はじめに
- 以前、とあるサーバーから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 = 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
(学校)に属しているような状態です。name
はschool
に対して属しているので、school
の列に複数同じ要素が現れることもあります。今の場合,新潟大が二回現れています。
そして、いわゆる親のような存在(ここではschool
)に対して処理したい場合が存在します。その場合,重複されているとちょっと困るというときがあるので、ある列から重複していない値を取り出す方法を紹介します。
それがunique()
です。pd.Series.unique()としてあげることで、その列から重複のないリストを取得することができます。
print(df["school"].unique())
#['新潟大' '千葉大']
これとitterrows()やitertuples()などと組み合わせれば、ユニークな値のみに対して処理を行うことができます。
最後にCSVで出力
最後に編集したCSVを出力して終了です。
df.to_csv(path,index=False) #pathは自分の保存したい場所に指定してください。
他にも色々な編集があると思います。とりあえず、自分が使ったものを紹介させてもらいました。
参考記事