2017-11-21 14 views
1

私は、日付、アイテム、および2値を含むpandasデータフレームを持っています。列Bが0パンダ - 値が0より大きい場合、条件付きで別の列で列を分割しますか?

date  item A B  C  
1/1/2017 a  0 3    0 
1/1/2017 b  2 0    0 
1/1/2017 c  5 2   2.5 
1/1/2017 d  4 1    4 
1/1/2017 e  3 3    1 
1/1/2017 f  0 4    0 
1/2/2017 a  3 3    1 
1/2/2017 b  2 2    1 
1/2/2017 c  3 9 0.333333333 
1/2/2017 d  4 0    0 
1/2/2017 e  5 3 1.666666667 
1/2/2017 f  3 0    0 

に等しい場合、これはコードで私が何を探しているすべての出力は、列Bが0より大きい場合、カラムA /列Bの生成物である他の列であり、そして0私が書いたが、カーネルが死ん続け

df['C'] = df.loc[df['B'] > 0, 'A']/df['B']) 

何が起こっている上の任意のアイデア(これは単なる例テーブルで覚えておいて、私持っている約30,000行あまりにもクレイジーな何もそう)?何かが無限に走っていて、それがクラッシュする原因になっていますか?助けてくれてありがとう。

+0

小さなデータフレームでクラッシュしますか?先験的にはバグのように聞こえる。クラッシュの原因となる行/行の範囲を絞り込んでください。 – tmrlvi

答えて

3

あなたがnp.where

df['C'] = np.round(np.where(df['B'] > 0, df['A']/df['B'], 0), 1) 

それとも、LOC

df.loc[df['B'] > 0, 'C'] = df['A']/df['B'] 

を使用すると、その後fillna場合(0)

+0

いいです。これは私の最初の選択肢でした。 –

+0

ええ、最も一般的なものです。私はほとんどマスクを使用していません....まだ:) – Vaishali

+0

これは素晴らしいです - 共有ありがとう!おそらくそれは私の最終的なエラーですが、データフレームからスライスのコピーに値を設定しようとする問題が発生していますか?私は前にその問題がなかったので、このスクリプトがそれを引き起こしているのだろうかと思っています。 –

3

オプション1
を使用してゲットすることpd.Series.maskを使用して0を非表示にし、次に空のセルをfillnaで空白にします。あるいは

v = (df.A/df.B.mask(df.B == 0)).fillna(0) 
v 

0  0.000000 
1  0.000000 
2  2.500000 
3  4.000000 
4  1.000000 
5  0.000000 
6  1.000000 
7  1.000000 
8  0.333333 
9  0.000000 
10 1.666667 
11 0.000000 
dtype: float64 

df['C'] = v 

x/inf = 0ので、np.inf有するものゼロに置き換えます。 df.replace

df.A/df.B.replace(0, np.inf) 

0  0.000000 
1  0.000000 
2  2.500000 
3  4.000000 
4  1.000000 
5  0.000000 
6  1.000000 
7  1.000000 
8  0.333333 
9  0.000000 
10 1.666667 
11 0.000000 
dtype: float64 

df['C'] = (df.A/df.B.mask(df.B == 0, np.inf)) 

オプション2
直接交換あなたが結果として混合整数と浮動小数点数をしたい場合は、astype変換を行うことができますが、覚えておいてください:

df.A.div(df.B.replace(0, np.inf)).astype(object) 

0   0 
1   0 
2   2.5 
3   4 
4   1 
5   0 
6   1 
7   1 
8  0.333333 
9   0 
10  1.66667 
11   0 
dtype: object 
+0

私は約...オプション2を投稿する:-)笑 – Wen

+0

@Wen笑、あなたが望むなら、私はそれを削除することができます投稿する。 –

+0

あなたのコメントに投稿する必要はありません:-)答えではありません – Wen

関連する問題