2017-04-17 8 views
1

私は10列のデータフレームを持っています。私は別の番号で各列を分割したいと思います。数字のリストでデータフレームを分割する方法は?また、リストに0があります。ゼロで割った場合、その列の数字を1にします。これを行う方法は?Python - データフレームを数値のリストで除算します。

おかげ

答えて

2

df = pd.DataFrame(np.random.rand(10, 10)) 

lst = np.array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0]) 

numpyの配列としてデータフレームdfとリストlstを与えられた後フィルターをかけるためにマスクを使うことができます。マスクを使用することで、ブール値スライシングを使用して、対応するゼロ値がlstの列だけを取得できます。 で簡単に非ゼロにアクセスし、スライスすることもできます。

m = lst == 0 

# assign the number 1 to all columns where there is a zero in lst 
df.values[:, m] = 1 

# do the division in place for all columns where lst is not zero 
df.values[:, ~m] /= lst[~m] 

print(df) 

      0 1   2 3   4 5 
0 0.195316 1.0 0.988503 1.0 0.981752 1.0 
1 0.136812 1.0 0.887689 1.0 0.346385 1.0 
2 0.927454 1.0 0.733464 1.0 0.773818 1.0 
3 0.782234 1.0 0.363441 1.0 0.295135 1.0 
4 0.751046 1.0 0.442886 1.0 0.700396 1.0 
5 0.028402 1.0 0.724199 1.0 0.047674 1.0 
6 0.680154 1.0 0.974464 1.0 0.717932 1.0 
7 0.636310 1.0 0.191252 1.0 0.777813 1.0 
8 0.766330 1.0 0.975292 1.0 0.224856 1.0 
9 0.335766 1.0 0.093384 1.0 0.547195 1.0 
+0

恐ろしい、あなたは説明することができますここでマスクを使用する目的は? – thatMeow

+0

@thatMeow説明の更新されたポストを参照してください。 – piRSquared

1

あなたはdivを使用して、1によって値L0を置き換えることができます。

df = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (df) 
    A B C D E F 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

L = [0,1,2,3,0,3] 
s = pd.Series(L, index=df.columns) 
df1 = df.div(s) 
df1[s.index[s == 0]] = 1 

print (df1) 
    A B C   D E   F 
0 1.0 4.0 3.5 0.333333 1.0 2.333333 
1 1.0 5.0 4.0 1.000000 1.0 1.333333 
2 1.0 6.0 4.5 1.666667 1.0 1.000000 
+0

このエラーMSGを得た:「例外TypeError:ブロック値がゼロによる除算を浮遊して([0、0、0、0、0])配列を操作できませんでした」 – thatMeow

関連する問題