【Python】CSVファイルを行ごとに読み込み、列を追加する方法

やりたいこと

怪人名戦闘力
アーマードゴリラ93
育ちすぎたポチ44
ムカデ長老73
モスキート娘58
深海王85
ホームレス帝60
ガロウ99
エビル天然水60

上のようなCSVファイルにおいて「2列目の値に応じて値が変わる列」を追加したい。

例えば戦闘力が80以上の怪人ならという値を、60以上ならを3列目に追加する。

解決法

1. pandasをインストール

Terminal window
$pip install pandas

今回CSVファイルを編集するために必要なライブラリ「pandas」をインストール。

import pandas as pd
import tkinter as tk
import tkinter.filedialog as fd

また、書き出し場所の指定をする際にダイアログボックスを使いたいので、「tkinter」もimportしておきます。

2. CSVファイルを読み込んで見出しを用意

file_csv = "<CSVファイル名>"
df = pd.read_csv(file_csv, encoding = "shift-jis",header=None, names=["怪人", "戦闘力"])
df["災害レベル"] = "" #事前に列を用意
  • read_csvメソッドでCSVファイルを読み込む
  • 列を追加する際に何かと不便なのでnames=のところで名前を指定して見出しを設定
  • 列がないと値も入れられないので事前に列を用意しておく

3. 列に値を格納

for i, row in df.iterrows():
if row[1] >= 90:
df["災害レベル"][i] = "神"
elif row[1] >= 80:
df["災害レベル"][i] = "竜"
elif row[1] >= 70:
df["災害レベル"][i] = "鬼"
elif row[1] >= 60:
df["災害レベル"][i] = "虎"
else:
df["災害レベル"][i] = "狼"

itterrowsメソッドで一行ごとにファイルを読み込み、戦闘力に応じた値を格納する。

4. ダイアログボックスからファイルを書き出す

root =tk.Tk()
root.withdraw()
file = fd.asksaveasfilename(
initialfile = "disaster_level",
defaultextension = ".csv",
title="保存場所を選んでください。",
filetypes = [("TEXT",".csv")]
)
with open(file,"w",encoding = "shift-jis") as f:
df.to_csv(f, index=False) #書き出し
print("保存完了しました。")

あとはダイアログボックスを用いてファイルの書き出し先を選択させ、to_csvメソッドでcsvファイルを書き出せばOK。

ダイアログボックスが表示される

試しに実行してみるとダイアログボックスが表示され、書き出しの指定ができるように。

ファイルが無事書き出された

それからファイルは無事書き出され、中身を見てみると目当ての3列目が追加されていた 🎉

コード全体

file_csv = "<CSVファイル名>"
df = pd.read_csv(file_csv, encoding = "shift-jis",header=None, names=["怪人", "戦闘力"])
df["災害レベル"] = "" #事前に列を用意
for i, row in df.iterrows():
if row[1] >= 90:
df["災害レベル"][i] = "神"
elif row[1] >= 80:
df["災害レベル"][i] = "竜"
elif row[1] >= 70:
df["災害レベル"][i] = "鬼"
elif row[1] >= 60:
df["災害レベル"][i] = "虎"
else:
df["災害レベル"][i] = "狼"
root =tk.Tk()
root.withdraw()
file = fd.asksaveasfilename(
initialfile = "disaster_level",
defaultextension = ".csv",
title="保存場所を選んでください。",
filetypes = [("TEXT",".csv")]
)
with open(file,"w",encoding = "shift-jis") as f:
df.to_csv(f, index=False) #書き出し
print("保存完了しました。")