ネストされたテーブル列、routeを持つテーブルがあります。その下には、整数IDと文字列型フィールドを持つマスターとスレーブの2つのネストされたデータ型があります。
table.readWhere('route / master / id == 0')のようなものを実行したいのですが、「変数route
はネストされた列を参照しており、条件では許可されていません」というメッセージが表示されます。
pytablesでネストされたデータ型をクエリする方法はありますか?
条件文字列内で使用する変数を作成する必要があります。1つのオプションは、変数ディクショナリを定義することです。
table.readWhere('rId==0', condvars={'rId': table.cols.route.master.id})
もう1つのオプションは、条件で使用される列のローカル変数を定義することです。
rId = table.cols.route.master.id
table.readWhere('rId==0')
これは名前空間を汚染するため、コードをラップする関数を作成することをお勧めします。列自体を参照しようとしましたが、インタプリタがNameErrorをスローする前にデータセット全体をフェッチしているようです。
table.readWhere('table.cols.route.master.id==0') # DOES NOT WORK
ライブラリリファレンスのwhere()メソッドの詳細。
streetoによる回答に基づいて、クエリを作成するときにテーブル内のネストされたすべての列にアクセスする簡単な方法を次に示します。
condvars = {k.replace('/', '__'): v for k, v in table.colinstances.items()}
result = table.read_where('route__master__id == 0', condvars=condvars)
table.colinstances
キーがテーブル内のすべての列(ネストされた列を含む)へのスラッシュで区切られたパスであり、値がそのパスにあるPyTablesColクラスのインスタンスであるフラットdictを返します。クエリでスラッシュ区切りのパスを使用することはできませんが、Python識別子内で許可されている他の区切り文字(この場合は二重アンダースコアを選択)に置き換えると、すべて正常に機能します。必要に応じて、他のセパレータを選択できます。