備忘録(pandastableのDataFrameオブジェクトのkeyerror)
おひさしぶりです。たかぎです。
ちょっと知り合いに頼まれてアプリ開発をしていましたが、pandastableのDataFrameオブジェクト内でセルに直接値を入力しようとしたところ、keyerror(整数値)というエラーが返ってきてデータが編集できないという問題が発生しました。
ChatGPTにpandasとpandastableのエラー箇所のソースを提示して原因を聞いたところ
このコードを見ると、self.currentcol
が列の位置(0から始まるインデックス)を参照していることが明確になります。これが self.model.getColumnType(self.currentcol)
で使用され、そこでエラーが発生しています。
したがって、エラーの原因は、getColumnType()
関数が列位置を引数として受け取り、列名を取得しようとするため、整数の列名と列位置が混同されている可能性が高いです。
対策としては以下のようなものが考えられます:
-
getColumnType()
の定義を見て、列位置ではなく列名を正しく参照できるように改修する。つまり、この関数は列名を引数として受け取るべきです。 -
handle_arrow_keys()
のcoltype = self.model.getColumnType(self.currentcol)
の部分を改修して、列名を引数として渡すようにする。つまり、列位置(self.currentcol
)から列名を取得するための変換が必要です。
以下のようなコードで列名を取得できます:
column_name = self.data.columns[self.currentcol]
coltype = self.model.getColumnType(column_name)
ただし、この改修によって getColumnType()
が列名を期待している他の箇所に影響を及ぼす可能性があるので注意が必要です。また、getColumnType()
関数がどのように定義されているかを確認することも重要です。この関数が列位置を受け取るように設計されている場合、この改修は機能しないかもしれません。
はい、そのアプローチも可能です。
あなたのDataFrameでは、1から31までの整数値が列の名前として使用されています。これは列の位置と混同される可能性があるため、これを避けるために列の名前を文字列に変更することができます。
例えば、以下のように「日」という文字列を加えることで列の名前を文字列に変えることができます。
# Rename the columns to be 'Day1', 'Day2', etc.
self.data.columns = ['名前', '職種', '性別'] + [f'日{day}' for day in range(1, days_in_month+1)] + ['休日数']
上記のコードは、日付を表す列の名前を '日1', '日2', '日3', などに変更します。こうすることで、列の位置と列の名前の混同を避けることができます。
ただし、列の名前を変更すると、その後のコードで列を参照する際にも変更を反映させる必要があります。この変更が他の箇所で予期しない影響を及ぼさないように注意してください。
こんな感じで原因をすぐに教えてくれました。