私は、非NaN
列の 値に条件付きパンダDataFrame
でNaN
値を充填に関する質問があります。説明するために:NaN以外の列の値に条件付きパンダDATAFRAMEでNaN値を充填
import numpy as np
import pandas as pd
print pd.__version__
0.18.1
df = pd.DataFrame({'a': [1, 0, 0, 0, 1],
'b': [0, 1, 0, 0, 0],
'c': [0, 0, 1, 1, 0],
'x': [0.5, 0.2, 0, 0.2, 0],
'y': [0, 0, 0, 1, 0],
'z': [0.1, 0.1, 0.9, 0, 0.4]})
df.ix[[2,4], ['x','y','z']] = np.nan
print df
a b c x y z
0 1 0 0 0.5 0.0 0.1
1 0 1 0 0.2 0.0 0.1
2 0 0 1 NaN NaN NaN
3 0 0 1 0.2 1.0 0.0
4 1 0 0 NaN NaN NaN
は今、私は最初の3つの列に依存して、いくつかのデフォルト値を、持っていると仮定します。つまり
default_c = pd.Series([0.5, 0.5, 0.5], index=['x', 'y', 'z'])
default_a = pd.Series([0.2, 0.2, 0.2], index=['x', 'y', 'z'])
、私は中NaN
の値についてdefault_c
にペーストしたいのですがより良い方法トンがあります
nan_x = np.isnan(df['x'])
is_c = df['c']==1
nan_c = nan_x & is_c
print nan_c
0 False
1 False
2 True
3 False
4 False
dtype: bool
df.ix[nan_c, default_c.index] = default_c.values
print df
a b c x y z
0 1 0 0 0.5 0.0 0.1
1 0 1 0 0.2 0.0 0.1
2 0 0 1 0.5 0.5 0.5
3 0 0 1 0.2 1.0 0.0
4 1 0 0 NaN NaN NaN
:行2、及びこれを行うには、行4にdefault_a
ペースト、私は以下のやや洗練解決策を考え出しましたo fillna()
関数を使用してこれを行いますか?
たとえば、次のように動作しません、私はDataFrame
のスライスを満たしていますので、私は推測している:
df.loc[df['a']==1].fillna(default_a, inplace=True)
print df
a b c x y z
0 1 0 0 0.5 0.0 0.1
1 0 1 0 0.2 0.0 0.1
2 0 0 1 0.5 0.5 0.5
3 0 0 1 0.2 1.0 0.0
4 1 0 0 NaN NaN NaN
しかし、この長い行はありません:
df.loc[df['a']==1] = df.loc[df['a']==1].fillna(default_a)
print df
a b c x y z
0 1 0 0 0.5 0.0 0.1
1 0 1 0 0.2 0.0 0.1
2 0 0 1 0.5 0.5 0.5
3 0 0 1 0.2 1.0 0.0
4 1 0 0 0.2 0.2 0.2
とにかく、このコードをできるだけシンプルにするためのアドバイスを探しています。
ニース!私のソリューションの列をループする必要がなくなります。 – hobgreenson