最近、艦これの遠征効率化の一環でExcelでやってた計算をPythonで計算させ、PyQtで作ったGUI上に表示させるってツールを作ってみました。
まだちょいと修正したい箇所も残ってるんですがおおむね完成。
で、作成している途中でPandasで作ったデータテーブルを獲得資源でソートし、要素を順々に取り出してQTableWidgetに格納していくのですがそこで少しはまったことがあったのでメモ。
dataという変数がPandasで作ったデータテーブルだとして、ソートは
data.sort_value(by="カラム名", ascending="False")
でカラム名の列の値に応じてソートできます。
ちなみにascending=Falseで降順、Trueで昇順ソートです。
で、ソート後のデータの要素にアクセスしてQTableWidgetに入れていくとなんとソートされる前の並び順で入っていく。
いろいろ悩んでいたんですが、要素アクセスの仕方がまずかったみたい。
間違いはこれ。
data["カラム名"][i]
やろうとしていることは、列名で指定して列を指定してそのi番目の要素を取り出して、ってつもりで書いたんですが、どうやらソート時はデータテーブルの行名も入れ替わっており、なおかつ特に行名はいじってなかったので0から順番に数字がついていて、その数字を場所をこれだと見に行くっぽい。
なので正しくはこれ。
data["カラム名"].iloc[i]
これでi番目の要素へアクセス、ってことになるみたい。
少し下らないかもしれませんがこんな感じ。
ちなみに、QDataTable事態にソート機能がついている(デフォルトはOFFになってるが)からそれでソートすればいいじゃんと思った方もいると思いますが、なぜかソート後に再計算してQDataTableに結果を格納すると結果がめちゃくちゃになった。
原因は調査中。
Pandasでのデータ操作も基本的なことがなんとなくわかった気になったんですが、せいぜい行列演算くらいしかしていないんでもうちょい使い込んでみたいですね。