pandasの使い方をググると、多くの場合にはsampleのcsvファイルを用意してそれを読み込ませてから使うという流れのものが多い印象がある。
読み込ませるファイルの区切りは基本的にカンマかタブであることを前提として作られている。
しかし、数値計算を扱っているコミュニティーとしては普通は(複数の)空白で数値を区切る。そして、普通に空白を区切りとして指定しpandasに読み込ませると、NaNだらけになってパッと使えない。
そのため、通常の用途ではnumpy.loadtxtで数値計算結果ファイルを読み込ませた方が楽である。
だが一方で、pandasのDataFrameのフィルタリングは非常に便利で、恩恵も多い。そのため、何らかの方法で用意したリストからDataFrameを構築し、体裁を整える or 解析することをやりたい。
例えば、次のような計算結果ファイル(sample.dat)があるとする。
Energy Intensity Quantity 0.0 0.0 0.0 0.5 0.25 1.0 1.0 0.75 3.0 ...
これを例えば横軸をEnergy、縦軸をIntensityにしてプロットしたいときには、numpy.loadtxtで読み込ませた配列を転置して使う。
import numpy as np from matplotlib import pyplot as plt data_T = np.loadtxt( 'sample.dat', skiprows=1 ).T # Transpose plt.plot( data_T[0], data_T[1] ) plt.show()
転置することで、行の指定によってEnergyかIntensityかを選ぶことができる。
一方、pandas.DataFrameに流し込む際には、表の構造を保ちたいので、転置無しでnumpy.loadtxtを使う。
import pandas as pd data = np.loadtxt( 'sample.dat' ) # No Transpose df = pd.DataFrame( data, columns=('Energy', 'Intensity', 'Quantity') ) # df.values is same as data
columnsやindexを変更するには、要素ではなくリストまるごとで指定する必要がある。
df.columns = ('E', 'I', 'Q')
中身の修正には、DataFrame.valuesからではなく、DataFrame.locやDataFrame.atと言った要素指定メソッドを介して行う。
df.loc[ :, 'I' ] *= 10
データの追加には、いろいろ方法があるが、好きな位置に挿入できるinsertが個人的には分かり易い。
def func( e_ ): ... df.insert( len(df.columns), 'Q2', func( df.loc[ :, 'E' ].values ) )
Energyに依存する適当な関数funcを用意して、Q2として最終列に挿入した。
ただし、insertは元のdfを変更してしまう(破壊的な手続き)であるため、メソッドチェーンに組み込むことができない場合がある。その時は、他のメソッドを使った方が無難であろう。
気に入らない行が列がある場合には、DataFrame.dropで落とせる。
df = df.drop( index =[...], columns=[...] )
本命のフィルタリングについては、DataFrame.queryを用いることで実行可能である。
e0 = 10 max_intensity = 1 print( df.query('E > @e0 and I < @max_intensity') ) # Not like df.query('"E" > @e0 and "I" < @max_intensity')
文字列で条件を入れることに注意。また列名が文字列でも「文字列の中で文字列」にする必要はない。変数は@を付ける。
注意として、列名に空白やピリオドが含まれているとコケる。一応、DataFrame.queryを使わなくても以下のような形で複数条件によるフィルタリングが可能ではある。
print( df.[ (df['E'] > e0 ) & (df['I'] < max_intensity) ] )
最後にソートについて。
df.sort_values( by='Q2', ascending=True )
"ascending=True"で昇順になる。
参考サイト
pandas.DataFrameの構造とその作成方法 | note.nkmk.me
pandas.DataFrameに列や行を追加(assign, appendなど) | note.nkmk.me
pandas.DataFrameの行・列を指定して削除するdrop | note.nkmk.me
pandas.DataFrameの行を条件で抽出するquery | note.nkmk.me
データ分析で頻出のPandas基本操作 - Qiita
pandasでcsv/tsvファイル読み込み(read_csv, read_table) | note.nkmk.me