【Python】CSVファイルを行ごとに読み込み、列を追加する方法
やりたいこと
怪人名 | 戦闘力 |
---|---|
アーマードゴリラ | 93 |
育ちすぎたポチ | 44 |
ムカデ長老 | 73 |
モスキート娘 | 58 |
深海王 | 85 |
ホームレス帝 | 60 |
ガロウ | 99 |
エビル天然水 | 60 |
上のようなCSVファイルにおいて「2列目の値に応じて値が変わる列」を追加したい。
例えば戦闘力が80以上の怪人なら竜
という値を、60以上なら虎
を3列目に追加する。
解決法
1. pandasをインストール
$pip install pandas
今回CSVファイルを編集するために必要なライブラリ「pandas」をインストール。
import pandas as pdimport tkinter as tkimport 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("保存完了しました。")