2016-09-16 6 views
0

私は大きなパンダのデータフレームを持っています。それは何千もの列と100万行以上あります。私は最大値と最小値の間の差を行ごとに計算したいと思います。多くのNaN値があり、いくつかの行はすべてNaN値であることに注意してください(ただし、私はまだそれらを保持したい!)。Pythonの大きなデータフレームで反復するコードを最適化する方法

私は次のコードを書いています。それは動作しますが、それは時間がかかります:

totTime = [] 
for index, row in date.iterrows(): 
    myRow = row.dropna() 
    if len(myRow): 
     tt = max(myRow) - min(myRow) 
    else: 
     tt = None 
    totTime.append(tt) 

それを最適化する方法はありますか?次のコードを試してみましたが、すべてのNaN行が発生したときにエラーが発生します。

tt = lambda x: max(x.dropna()) - min(x.dropna()) 
totTime = date.apply(tt, axis=1) 

すべての提案があります。

+3

IIUCあなたがちょうどすることができます 'date.max(軸= 1) - data.min(軸= 1) ' – EdChum

+3

ループを使って' apply'を使わずにベクトル化されたメソッドを検索することをお勧めします。ほとんどのpandas opsは 'NaN'をうまく扱い、操作の前後にフィルターをかける必要があります。 – EdChum

答えて

2

大規模なpandas.DataFrameまたはnumpy.ndarrayを反復するためにpythonforループを使用するために、通常は悪い考えです。使用可能なビルドは、最適化されている関数で使用する必要があります。多くの場合、実際にはPythonではなくコンパイルされた言語で記述されています。あなたの場合、pandas.DataFrame.maxpandas.DataFrame.minの両方を使用すると、skipnananの値をDataFrameにスキップして、実際に手動で削除する必要はありません。さらに、axisを選択して、最小化することもできます。したがって、axis=1を指定して列に沿って最小値を得ることができます。

これは@EdChumはちょうどコメントで述べたものと同様のものにまで追加されます:

data.max(axis=1, skipna=True) - data.min(axis=1, skipna=True) 
+2

'skipna'はデフォルトの' True'ですので、不要です:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.max.html – EdChum

+0

おかげで、ありがとう。私は通常、暗黙的に明示的に好むとそれを維持します。 – jotasi

0

私は反復について同じ問題があります。 2点:

  1. なぜNaN値を0に置き換えないのですか?これはdf.replace(['inf','nan'],[0,0])で行うことができます。これは、inf値とnan値を置き換えます。
  2. このThisをご覧ください。多分あなたは理解することができます、私は前のものとの実際の行の違いを計算するためにループを最適化する方法について同様の質問があります。
+0

こんにちはジュリアナ。 NaNの値を0に置き換えないのは、私の場合のNaNは欠損を意味し、0は可能な測定値であるためです。 NaNを0に置き換えると、私のデータはもはや私の場合を表しなくなります。あなたが共有した投稿にも同意します。 forループを避けることが鍵です。 –

関連する問題