2016-03-22 3 views
4

データフレーム内の負の値の合計が必要です。私は配列を取得することができますが、DataFrameを見つけることができません。配列のために私は以下のコードを使用していますいずれか私はどのようにDataFrame以下のカウントを取得することができます。以下はデータフレーム内の負の値のカウントが必要

sum(n<0 for n in numbers) 

私のデータフレームであると期待される結果は4

a b c d 
    -3 -2 -1 1 
    -2 2 3 4 
    4 5 7 8 

答えて

0

私はそれが1次元配列上で操作機能を使用するためにデータフレームを平坦にすることが可能です配列のために取得することができますがDATAFRAME

を見つけることができません。だから、あなたはその(EdChumの答えよりも遅くなる可能性が高い)で大丈夫なら:

>>> import pandas as pd 
>>> df = pd.DataFrame({'a': [-3, -2, 4], 'b': [-2, 2, 5], 'c': [-1, 3, 7], 'd': [1, 4, 8]}) 
>>> df.values 
array([[-3, -2, -1, 1], 
     [-2, 2, 3, 4], 
     [ 4, 5, 7, 8]]) 
>>> df.values.flatten() 
array([-3, -2, -1, 1, -2, 2, 3, 4, 4, 5, 7, 8]) 
>>> sum(n < 0 for n in df.values.flatten()) 
4 
+0

これは小さいdfsのほうが速いですが、大きなdfsの場合はうまくスケールされません。答えは – EdChum

+0

です –

6

であるあなたは、スカラー値に対してDFを比較する.ltを呼び出し、それが行方向第一を加算するので、これがある(2回sumを呼び出すことができますSeriesを合計する再び)

In [66]: 
df.lt(0).sum() 

Out[66]: 
a 2 
b 1 
c 1 
d 0 
dtype: int64 

コールsum

In [58]: 
df.lt(0).sum().sum() 

Out[58]: 
4 

あなたはまた、1-Dアレイにdfをブール値に変換し、np.sumを呼び出すことができます。

30K行DFについて
In [62]: 
np.sum((df < 0).values.ravel()) 

Out[62]: 
4 

タイミング

In [70]: 
%timeit sum(n < 0 for n in df.values.flatten()) 
%timeit df.lt(0).sum().sum() 
%timeit np.sum((df < 0).values.ravel()) 

1 loops, best of 3: 405 ms per loop 
100 loops, best of 3: 2.36 ms per loop 
1000 loops, best of 3: 770 µs per loop 

npメソッドはループメソッドよりも525倍高速で、純粋よりも〜4倍高速ですパンダ方法

+0

ニース1、合計二回のこと、このため – bakkal

+0

感謝を。非常に良い解決策。 –

関連する問題