2017-03-28 16 views
1

データフレームのゼロ値を各行の最後の列にある値に変更したいとします。私は列や行のforを使ってこれを解決することができますが、それはあまりにも私にpythonicのように見えませんでした。要するに条件付きでデータフレーム内の別の列の値を割り当てます

、私はこのようなデータフレームがありますので、私は取得したい

col1 col2 col3 nonzero 
1 2 0 10 
1 0 3 20 

を、私は

df[df==0] = df.nonzero 

のような操作を行うにはしたいと思い

col1 col2 col3 nonzero 
    1 2 10 10 
    1 20 3 20 

ただし、[df == 0]はTrue/False値を持つDataFrame自体であるため、これは機能しません。これはどうすればできますか?

答えて

1

1つのオプションはデータフレームの行をapply方法、ループを使用して、行の最後の要素にゼロを置き換えることである:

df.apply(lambda row: row.where(row != 0, row.iat[-1]), axis=1) 

enter image description here

あなたはまた、データフレームを変更することができ場所:

df[df == 0] = (df == 0).mul(df.nonzero, axis=0) 

これは、上記と同じ結果としてdfを生成します。この方法では、(df == 0).mul(df.nonzero, axis=0)は、ゼロ以外の列の値とその他のエントリの値でゼロエントリを置き換えたデータフレームを作成します。ブールインデックス作成と割り当てと組み合わせることで、あなたは条件付きで元のデータフレーム内のゼロのエントリを変更することができます。

(df == 0).mul(df.nonzero, axis=0) 

enter image description here

+0

DF == 0.mulソリューションがうまく働いたが、適用法が私に与えましたエラー 'オブジェクト型クラスの名前の軸がありません –

+1

'axis'パラメータを正しく配置しなかった可能性があります。' df'が 'where'の代わりに' apply'メソッドのパラメータであることに気づくでしょう。データフレーム、シリーズオブジェクトではありません。 – Psidom

+0

確かに。非常にクールなソリューション –