Python : Dataframeの検索して読み込み及び書き換え
Pythonのpandasを用いた
dataframeからのデータの読み込み及び検索した値での書き込みについてです。
pandasは最初に考えた人が動物のパンダが好きだったのかな?と思っていたのですが、
「panel - data - s」からきているようです。
多次元の構造化されたデータセットという意味のようです。
なんとなくパンダも好きだったような気はしますけどね。
関係ないですが、動物のパンダですが、中国語だと熊猫(Xiong Mao)と言います。
パンダと聞くと発音的には胖的(Pang de)という風に私には聞こえます。
この胖的という意味は肥ったとかそういう意味なので、
むか~し、イギリス人あたりが中国でパンダを見たときに、あれ太っているというのを
聞いてパンダって名前になったのかなーなんて思っています。
さて、今回はcsvファイルに書き込み、
それを検索して書き込みという方法を取ります。
今回はPandasを使うので、インポートします。
import pandas as pd
ファイルの作成は下記です。
import pandas as pd #csvファイルを作成 f = open('pandas.csv','w',encoding='utf-8') #作成するCSVの列名 f.write('line'+','+'column'+','+'a'+','+'b'+'\n') #書き込むデータ list_line =[1,2,3,4,5,6] list_column = ['a','b','c','d','e','f'] list_a = [10,20,30,40,50,60] list_b = [100,200,300,400,500,600] #dataを書き込む for i in range(0 , 6): f.write(str(list_line[i]) + ',') f.write(str(list_column[i]) + ',') f.write(str(list_a[i]) + ',') f.write(str(list_b[i]) + '\n') i = i + 1 #dataframeを閉じる f.close()
こんな感じのファイルになります。
CSVファイルの作成については以前下記で説明したので、
こちらを参照ください。
検索するファイルができたら、
まず読み込みます。
f1 = pd.read_csv('pandas.csv')
次に検索ワードを設定します。
ここを変えれば違うものを抽出できます。
line_i = 2
column_i = 'b'
これは蛇足ですが、行をすべて取得する場合は下記のように取得します。
f1_01 = f1[(f1['line'] == line_i) & (f1['column'] == column_i)]
本題ですが、indexを取得します。
データを抜くときにindex、即ち何行目にあるか?というのがわかると
後は、その列の名前、今回だと'a'とか'b'を指定すれば抜き出せます
indexは下のdatafurameの赤丸の部分です。
上の行すべてと似たようなものですが、indexは下記のように取得します。
f1_02 = f1.index[(f1['line'] == line_i) & (f1['column'] == column_i)]
今回はlineとcolumnという2種類から検索をかけているので、&を使っています。
一つだけの場合は一つだけにしてください。
一致しているかの確認をします。
手っ取り早いのはlenを使って存在するか(1)しないか(0)を見ます。
print(len(f1_02))
ここからif文で一致する場合としない場合の処理です。
if len(f1_02) == 1:
まず一致の場合
インデックスNoをindex_iに代入
index_i = f1_02[0]
結果の表示と一致したというコメント
print(f1.at[index_i,'a'])
print(f1.at[index_i,'b'])
print('一致しました')
単に抜き出す場合はこのようにすれば抽出できます。
result_a = f1.at[index_i,'a']
結果を書き換える場合はこのようにします。
今回は適当に15,20に書き換えます。
f1.at[index_i,'a'] = 15
f1.at[index_i,'b'] = 20
結果を表示します。
print(f1)
こんな感じのcsvファイルになります。
一致しなかった場合の処理です。
else:
print('一致しませんでした')
最後にデータの上書きです。
名前を変えて保存したい場合は、別のファイル名にしてください。
f1.to_csv("pandas.csv", index=False)
今回はデータ量が少ないので、csvにしましたが、
数千ぐらいのデータならcsvでも構いませんが、
数万になる場合は、csvはやめておいたほうがよいです。
バイナリファイルとかほかのファイル形式でやることをお勧めします。
ただ、ソフト起動じのパラメータの保存ぐらいだとcsvのほうが直接ファイルも
確認できるのでお手軽です。
プログラムの詳細は下記です。
import pandas as pd #csvファイルを作成 f = open('pandas.csv','w',encoding='utf-8') #作成するCSVの列名 f.write('line'+','+'column'+','+'a'+','+'b'+'\n') #書き込むデータ list_line =[1,2,3,4,5,6] list_column = ['a','b','c','d','e','f'] list_a = [10,20,30,40,50,60] list_b = [100,200,300,400,500,600] #dataを書き込む for i in range(0 , 6): f.write(str(list_line[i]) + ',') f.write(str(list_column[i]) + ',') f.write(str(list_a[i]) + ',') f.write(str(list_b[i]) + '\n') i = i + 1 #dataframeを閉じる f.close() #ファイルを読み込む f1 = pd.read_csv('pandas.csv')
#検索ワードを設定 line_i = 2 column_i = 'b' #一致する行をすべて取得 ※今回のプログラムとしてはなくてもよい f1_01 = f1[(f1['line'] == line_i) & (f1['column'] == column_i)] print(f1_01) #indexを取得 f1_02 = f1.index[(f1['line'] == line_i) & (f1['column'] == column_i)] print(len(f1_02)) #一致しているかどうかの確認、存在していれば1つある。 if len(f1_02) == 1: #index[0]列目を変数に index_i = f1_02[0] #検索した行の結果を取得 print(f1.at[index_i,'a']) print(f1.at[index_i,'b']) print('一致しました') #結果の上書き f1.at[index_i,'a'] = 15 f1.at[index_i,'b'] = 20 print(f1) else: print('一致しませんでした') #ファイルの上書き、別の名前にしたい場合はファイル名を変える。 f1.to_csv("pandas.csv", index=False)
今までにpythonについて書いた記事はここにリンクを貼ってあります。
興味があればぜひご覧ください。