日頃から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
'''