Pandasのデータフレームで任意の行・列を指定してデータを取得・変更する方法について解説していきます
機械学習やデータ分析の際には、前処理の段階で、条件にあう特定データの行・列を抽出する場合などに使用することが多いです。
また、GUIとして、キーワードを入力しておき、csvを読みこませることで、そのキーワードに合致するデータ抽出の方法についても解説していきたいと思います。
完成のイメージはこんな感じです
Contents
pandasとは
まずpandasについて簡単に説明を入れておきます
pandasというのは、pythonにおいて表形式になっており、データ分析を効率的に行うためのライブラリです
csvファイルなどの読み込み・集計・加工・可視化などが可能です

pandasで要素を抽出する方法
pandasで要素を抽出する方法は4種類です
- loc:スライス表記で、ラベル名を指定(複数可能)
- iloc:行もしくは列番号を指定(複数可能)
- at:ラベル名を指定(単独)
- iat:行もしくは列番号を指定(単独)
大きく分けると上記の4種類になります
処理速度は単独抽出のat,iatが速いです
まずはpandasでcsvファイルを読み込みます
import pandas as pd
#pandasでcsvファイルの読み込み
file=pd.read_csv('XXXXXXX.csv',index_col=0)
#読み込んだcsvのインデックスとカラム名を出力
print(file.index.values)
print(file.columns.values)

読み込んだcssvファイルの中身

インデックスとカラム名
at,iatで要素の抽出
atはラベル名を指定します
データ抽出だけではなく、その位置に新たな値を設定することも可能です
import pandas as pd
#pandasでcsvファイルの読み込み
file=pd.read_csv('XXXXXXX.csv',index_col=0)
#AのhipflexROMを指定して出力
print(file.at['A','hipflexROM'])
>>>95
#atを使用して、AのhipflexROMを95から120に書き換え
file.at['A','hipflexROM']=120
#再度AのhipflexROMを指定して出力
print(file.at['A','hipflexROM'])
>>>120
iatは行番号・列番号を指定して、要素を抽出します
at同様、iatはデータ抽出だけではなく、その位置に新たな値を設定することも可能です
import pandas as pd
#pandasでcsvファイルの読み込み
file=pd.read_csv('XXXXXXX.csv',index_col=0)
#iatを使用して、行番号・列番号を指定(1行目の0列目)して出力
print(file.iat[1,0])
>>>100
#iatを使用して、新たな値120に書き換え
file.iat[1,0]=120
#再度iatを使用して、行番号・列番号を指定(1行目の0列目)して出力
print(file.iat[1,0])
>>>120
iatを使用する場合は、行番号・列番号ともに「0」始まり
loc,ilocを使用して単独もしくは複数の要素を抽出
loc,ilocは単独だけではなく、複数の要素を抽出することも可能
locでは行名と列名で要素を指定します
import pandas as pd
#pandasでcsvファイルの読み込み
file=pd.read_csv('XXXXXXX.csv',index_col=0)
#locを使用して、行名・列名を指定して出力
print(file.loc['A','hipflexROM'])
>>>95
#ilocを使用して、行番号・列番号を指定して出力(1行目・0列目)
print(file.iloc[1,0])
>>>100
#locを使用して、AのhipflexROMを150に書き換え
file.loc['A','hipflex']=150
#再度locを使用して、行名・列名を指定して出力
print(file.loc['A','hipflexROM'])
>>>150
#ilocを使用して、1行目の0列目を150に書き換え
file.iloc[1,0]=150
#再度ilocを使用して、行番号・列番号を指定して出力(1行目・0列目)
print(file.iloc[1,0])
>>>150
#AからF行目までのhipflexROMを出力
print(file.loc['A':'F','hipflexROM'])
>>>
ID
A 95
B 100
C 110
D 85
E 70
F 65
#0から3行目のhipflexROMからhipabdROMまでを出力
print(file.iloc[:3,[0,2]])
>>>
hipflexROM hipabdROM
ID
A 95 15.0
B 100 15.0
C 110 10.0
複数の要素を抽出する方法
複数の要素を抽出する場合には、
#AからF行目までのhipflexROMを出力
print(file.loc['A':'F','hipflexROM'])
#0から3行目のhipflexROMからhipabdROMまでを出力
print(file.iloc[:3,[0,2]])
上記のようなスライス表現を用います
スライス表現では、start:stop:stepの順に要素を指定して、抽出を行なっていきます
ilocでスライス表現をする場合には、stepは省略になりますが、locを使用する場合にはstepまで記載しないとエラーになることもあります
またリストでの表現でも可能です[a,b,c…]のように表現することでも、複数の要素を抽出することができます
外部からキーワードを入力して要素を抽出する
GUIに実装する場合などには、外部からキーワードを入力して、要素を抽出することも可能です
import pandas as pd
import tkinter as tk
import os
from tkinter import filedialog
from scipy import stats
root=tk.Tk()
root.title("test")
root.geometry("800x600")
frame=tk.Frame()
frame.grid(row=0)
var=tk.StringVar()
var1=tk.StringVar()
text=tk.Entry(width=20,textvariable=var)
text.place(x=500,y=100)
listbox=tk.Listbox(frame,height=30,selectmode="single")
listbox.grid(row=1,column=1)
def fileselect():
global var
type = [("CSV file", "*.csv")]
file_path = tk.filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())
csv_file = pd.read_csv(file_path, engine="python", index_col=None)
i = var.get()
if i in csv_file.columns:
word = csv_file.loc[:,i].values
listbox.insert(tk.END,word)
Button=tk.Button(frame,text="selectfile",command=fileselect,width=20)
Button.grid(row=3,column=1)
root.mainloop()
サンプルの動画ではボタンが2種類、リストボックスが2つになっていますが、
こちらのサンプルコードでは、それぞれ1つずつに変更をしています
if i in csv_file.columns:
word = csv_file.loc[:,i].values
listbox.insert(tk.END,word)
上記コードを増やせば、抽出する項目を増やすことも可能です
その際にはグローバル関数も増やし、i=var.get()も増やしておく必要がありますので、注意してください
もし、グローバル関数を使わずに実装することができた方がいたら、DMやコメントをもらえると嬉しいです!
ixを使用した要素の抽出
ixを使用することで、公式ドキュメントでは非推奨となっているため、割愛しました
公式ドキュメントは英語で書かれていますが、Google Chromeでページを開けば、翻訳してくれますので、参考にしてみてください
また、Qiitaではixを使用した時の困った例が挙げられています