Back to tech

pythonライブラリのpandasである値(要素)を持っている行を抜き出す等のメモ

3 min read
Table of Contents

日頃からPythonでいろいろプログラムを書いている私です

久しぶりにcsvファイルをあつかう事案が発生したのでpandasというライブラリを使ってみることにしました

使っていて手こずったところをメモします

テストデータ

予めテストデータを作っておきます

ファイル名はtarget.csvとし、中身は適当に下記のようにしました

IDNAMENUM
A01Tanaka1
A02Sato2
A03Yamada3
A04Kondo3

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
'''

参考文献