日頃からPythonでいろいろプログラムを書いている私です
久しぶりにcsvファイルをあつかう事案が発生したのでpandasというライブラリを使ってみることにしました
使っていて手こずったところをメモします
テストデータ
予めテストデータを作っておきます
ファイル名はtarget.csvとし、中身は適当に下記のようにしました
ID | NAME | NUM |
A01 | Tanaka | 1 |
A02 | Sato | 2 |
A03 | Yamada | 3 |
A04 | Kondo | 3 |
csvファイルの読み込み
いろんなサイトで解説しているようにcsvファイルを読み込みます
#!/usr/bin/python # -*- Coding: utf-8 -*- import pandas as pd #CSVファイルの読み込み Csv = pd.read_csv("target.csv") print(Csv) ''' ## out ID NAME NUM 0 A01 Tanaka 1 1 A02 Sato 2 2 A03 Yamada 3 3 A04 Kondo 3 '''
ある列のデータ型を一括で変える
現在、target.csvのNUMには数値が入っています
これを一括で文字列(正確にはobject)へ変換をします
#!/usr/bin/python # -*- Coding: utf-8 -*- import pandas as pd #CSVファイルの読み込み Csv = pd.read_csv("target.csv") print("変更前:\n", Csv["NUM"]) #astypeをして再度代入してあげる Csv["NUM"] = Csv["NUM"].astype("str") print("変更後:\n",Csv["NUM"]) ''' ##out 変更前: 0 1 1 2 2 3 3 3 Name: NUM, dtype: int64 変更後: 0 1 1 2 2 3 3 3 Name: NUM, dtype: object '''
ある列同士を結合して新しい列に加える
すべての列を結合し、新たに”KETUGOU”という列を作ってみます
ただ結合するのはつまらないので間にハイフン(-)を入れます
また、NUMがint型なので結合前にほかの列と型を揃えておきます
#!/usr/bin/python # -*- Coding: utf-8 -*- import pandas as pd #CSVファイルの読み込み Csv = pd.read_csv("target.csv") #NUMがintでほかはobjectなので結合するとエラーがおこる.そのため、事前にobject型へ変更する Csv["NUM"] = Csv["NUM"].astype("str") Csv["KETUGOU"] = Csv["ID"] + "-" + Csv["NAME"] + "-" + Csv["NUM"] print(Csv) ''' ##out ID NAME NUM KETUGOU 0 A01 Tanaka 1 A01-Tanaka-1 1 A02 Sato 2 A02-Sato-2 2 A03 Yamada 3 A03-Yamada-3 3 A04 Kondo 3 A04-Kondo-3 '''
特定の行にある列の値をもらいたい
たとえば、サンプルファイル(target.csv)にあるKondoのKETUGOUの値をもらいたいとしたいとします
上記の列同士を結合してからもらうようにしてみます
値は配列で受け取ることになります
そのため、values[0]にしてあげることでひとつだけもらうようにしています
#!/usr/bin/python # -*- Coding: utf-8 -*- import pandas as pd #CSVファイルの読み込み Csv = pd.read_csv("target.csv") #NUMがintなので結合するとエラーがおこる.そのため、事前にobject型へ変更する Csv["NUM"] = Csv["NUM"].astype("str") #列同士を結合 Csv["KETUGOU"] = Csv["ID"] + "-" + Csv["NAME"] + "-" + Csv["NUM"] #取り出したい列にある値をもらう Value = Csv.loc[ Csv["NAME"] == "Kondo", "KETUGOU" ].values[0] print(Value) ''' ## out A04-Kondo-3 '''
ある列にて任意の値を持っているすべて列に対して、異なる列の値を変更する
あらたにSTATEという列を追加し、NUMの列で”3″という値を持っているすべての行のSTATE列に”OK”という値を入れたいとします
この操作がpandasではかなりギミックであり、悩んだところでした
肝なのが.atをつけて行うということと、[ ](括弧)のなかで条件文をつくることです
#!/usr/bin/python # -*- Coding: utf-8 -*- import pandas as pd #CSVファイルの読み込み Csv = pd.read_csv("target.csv") #NUMがintなので結合するとエラーがおこる.そのため、事前にobject型へ変更する Csv["NUM"] = Csv["NUM"].astype("str") #STATEという列を作成 Csv["STATE"] = None print("変更前:\n",Csv) #NUM列にある3という値があればSTATEに"OK"という値を入れる Csv.at[ Csv["NUM"] == "3", "STATE" ] = "OK" print("変更後:\n",Csv) ''' ## out 変更前: ID NAME NUM STATE 0 A01 Tanaka 1 None 1 A02 Sato 2 None 2 A03 Yamada 3 None 3 A04 Kondo 3 None 変更後: ID NAME NUM STATE 0 A01 Tanaka 1 None 1 A02 Sato 2 None 2 A03 Yamada 3 OK 3 A04 Kondo 3 OK '''
値を0埋め(ゼロ埋め)する
数値の値を揃えるときに0埋めで行うための処理です
サンプルでは整数にて10の位に合わせています
#!/usr/bin/python # -*- Coding: utf-8 -*- import pandas as pd #CSVファイルの読み込み Csv = pd.read_csv("target.csv") print("Before:\n",Csv) #0埋め ZeroPadding = 2 #一度str型にする Csv["NUM"] = Csv["NUM"].astype("str") Csv["NUM"] = Csv["NUM"].apply(lambda x: x.zfill(ZeroPadding)) print("After:\n",Csv) ''' out Before: ID NAME NUM 0 A01 Tanaka 1 1 A02 Sato 2 2 A03 Yamada 3 3 A04 Kondo 3 After: ID NAME NUM 0 A01 Tanaka 01 1 A02 Sato 02 2 A03 Yamada 03 3 A04 Kondo 03 '''
コメント