2017-05-12 3 views
0

に合計施行、および3は、一つにまとめる必要があります。パンダDataframe-ラウンド複数の列が、彼らは、私は、列A、B、およびCは重みで、次のデータフレームを考えてみましょう1

df = pd.DataFrame(data=[[0.56, 0.36, 0.08], [0.42, 0.13, 0.45]], columns=['A', 'B', 'C']) 

場合df.sum(軸= 1)を適用すると、実際にはすべてが1になります。私の目標は、同じ列のセットを持つことですが、1つの小数点以下を四捨五入します(10%のバケットに収まるように私のビンを空にする必要があります)。我々はこれを行うときに問題がある:

df.round(1).sum(axis=1) 

我々は、0.9(0.4 + 0.1 + 0.4)1.1(0.6 + 0.4 + 0.1)への最初の行の合計ことがわかり、2行目。複数の列に対して「合計が1になる」制約を適用しながら、パンダでラウンドする方法はありますか?

+1

私は最後の重みを1から他の重みの合計を差し引いて設定すると思いますか? – IanS

+0

しかし、私は最後の非ゼロの重みを設定する必要があるでしょう(私の実際の問題は20 +重みを持ち、そのうちの3〜5は与えられた行で非ゼロであり、すべて0はゼロのままでなければならない)。他のウェイトの合計から1を引いた値にランダムな非ゼロ値を設定する方が良いでしょう。 – MarkD

答えて

2

いいえこのジョブを実行するために使用できるさまざまなアルゴリズムがありますが、詳細な処理(つまり、行を繰り返し処理する)が必要です。

"truncate-allocate"と呼ぶのが最も簡単なのでしょう。切り捨てられた量と残った部分(丸めに使用する部分)を維持しながら、丸め点で行の各要素を分割します。たとえば、上記の最初の行は次のようになります。

trunc = [0.50, 0.30, 0.00] 
alloc = [0.06, 0.06, 0.08] 

ここで、sum(trunc)が0.8であることを確認してください。割り当てするユニットは2つです。 allocの最大の2つの要素を探します。これらは他の2つのうちの最後とどちらかです(おそらく2進表現の最後のビットによって決定されます)。今では1

に合計あなたはそれで作業することができ

trunc = [0.6, 0.3, 0.1] 

:これら二つの要素に追加しますか?あなたの問題を解決するのに十分簡単ですか?私は組み込み関数ではないことを知っていますが、理解し、実装し、維持するのは簡単です。

+0

これはかなりうまくいくと思います!私はそれを試して、それがどのように行くのかを教えてあげます。 – MarkD

関連する問題