2017-01-04 5 views
3

フラスコ内のパンダデータフレームを編集する最も良い方法は何ですか?フラスコ内のパンダデータフレームの編集ページ

フラスコ付きHTMLページに出力したいデータフレームがあります(これを行う方法はたくさんあります)。しかし、出力したいだけではなく、編集可能にしたいのです。理想的には、各フィールドはhtml入力フィールドでなければなりません。

フォームを手動で作成してから、データフレームに再変換する必要はありません。そこにエレガントな解決策はありますか? pandasや他のパッケージは、そのタスクを簡略化する機能を提供していますか?

+0

その時点で、あなたはWebアプリケーションを作っているので、クリックするとテーブルの部分を編集可能なフィールドに変更するJavaScriptが必要になります.AJAX(またはWebソケット、ファンシーにしたい場合)編集が完了したとき等にフィールドを更新するなど –

+0

JavaScriptは不要です。何らかの形でフォームやモデルを生成し、それをデータフレームに変換する送信ボタンを使ってサーバーに戻す方法があればうれしく思います。 – Nickpick

答えて

4

df.styleStylerインスタンス)を使用して、DataFrameをHTML入力のグリッドとしてレンダリングできます。

np.random.seed(0) 

df = pd.DataFrame(np.random.randint(0, 100, (3, 3))) 
df.style.format('<input name="df" value="{}" />').render() 

あなたは<form>で結果をラップし、いくつかのエンドポイント、リクエストのクエリ文字列(またはPOST体)に提出した場合はこれが

HTML table

としてレンダリングされますが

のようになります。
df=44&df=47&df=64&df=67&df=67&df=9&df=83&df=21&df=36 

これらは、行優先順位のデータフレームのセルであることに注意してください。あなたがあなたのコメントには、別のアプローチは、データを再構築することを避けるために、列名と名前のHTML入力にある示唆したように、この時点で、あなたは

df = pd.DataFrame(np.asarray(request.values.getlist('df'), dtype=np.int).reshape((3, 3))) 

使用してデータフレームを再作成することができます。サーバーに送信され

def html_input(c): 
    return '<input name="{}" value="{{}}" />'.format(c) 

df.style.format({c: html_input(c) for c in df.columns}).render() 

データは

0=44&1=47&2=64&0=67&1=67&2=9&0=83&1=21&2=36 

のようになりますと、あなたはこれが離れてから、上記よりもエレガントです

df = pd.DataFrame(request.values.lists()) 

を使用してデータフレームを復元することができますフォーマッタ辞書{c: html_input(c) for c in df.columns}を作成する必要があります。残念ながら、フォーマッタ関数は値だけを渡され、インデックス情報は渡されません。

+0

それは素晴らしいことです。私が見ることができるのは、データフレーム列の名前を保持する方法があるため、.reshape(...)を実行する必要があります。私がたくさん持っているので、すべてのフィールドをdfという名前にすることはむしろ実用的ではありません。 – Nickpick

+0

@nick、私の編集を参照してください。また、私が以前行っていたことのためのショートカットである 'df.style.format'に文字列を渡す最初のアプローチをやや簡略化しました。 –

関連する問題