2017-12-11 4 views
1

Seriesは、DataFrameの各列に対してSeriesを合計したいと考えています.nansumと同じ動作をしています。両方が欠けている場合はNaN/0を返します。パンダ:DataFrameの各列へのnansumシリーズ

テストケース:

import numpy as np 
import pandas as pd 

df = pd.DataFrame([[np.nan, 1], [2, 2], [3, 4]]) 
ts = pd.Series([1, np.nan, 4]) 

試み1(一方が欠落している場合はNaNを与える):

df.add(ts, axis=0) 

Out[115]: 
    0 1 
0 NaN 2.0 
1 NaN NaN 
2 7.0 8.0 

試み2(エラーをスロー):

df.add(ts, axis=0, fill_value=0) 
NotImplementedError: fill_value 0 not supported. 

期待出力:

0 1 
0 1 2 
1 2 2 
2 7 8 

注:NaNの場所を保存して、NaNを0にして合計を行い、両方がNaNの場合はNaNに設定しますが、より良い解決策を探しています。

+1

なぜ 'fillna'? 'df.fillna(0).add(ts.fillna(0)、axis = 0)' –

+0

pandas 0.21では、すべてのNaNの合計がNaNを返します。だから私があなたの提案をするなら、データフレームとシリーズの両方がNaNである場合にマスクを適用する必要があります。 私は狂ったことはありませんが、私はパンダが上記の操作をサポートしていないことに驚いています。より良い解決策があるかどうかを知りたいと思います。 – FLab

+0

はい、機能は動作していますが、まだ実装されていません。タイトに座って、次のリリースで外に出るはずです。それまでは、これは回避策です^^^^ –

答えて

3

fill_valueNone以外のものはまだ動作していますが、今のところこれを回避する必要があります。追加を実行し、マスクを計算して必要に応じてNaNを元に戻します。

r = df.fillna(0).add(ts.fillna(0), axis=0) 

m = df.isnull().__and__(ts.isnull(), axis=0).values 
v = r.values 
v[m] = np.nan 

r[:] = v 
r 
    0 1 
0 1.0 2.0 
1 2.0 2.0 
2 7.0 8.0 
+0

完全なソリューションをありがとう。 .__と__またはそれ以上のハックを使用することをお勧めしますか? – FLab

+0

@FLabそれはちょっとハッキリですが、それは私が軸を指定する唯一の方法でした。オーバーロードされた演算子は、柔軟性を提供しません。 –

関連する問題