2017-09-11 7 views
1

現在の行がすべてnanである場合にのみ、前の行にpandas dfを入力します。 これは、fillnaが賢明である必要がある一方で、要素が賢明に機能するため、fillna(method='ffill', limit = 1)が私のケースでは機能しないことを意味します。Forward fill Pandas dfは、行全体がNanである場合のみ

この作業を達成するためのよりエレガントな方法は、以下の手順よりもありますか?

s = df.count(axis = 1) 

for d in df.index[1:]: 
    if s.loc[d] == 0: 
     i = s.index.get_loc(d) 
     df.iloc[i] = df.iloc[i-1] 

入力

v1 v2 
1 1 2 
2 nan 3 
3 2 4 
4 nan nan 

出力

v1 v2 
1 1 2 
2 nan 3 
3 2 4 
4 2 4 

答えて

1

あなたはffillを適用するためのフィルタ行のための条件を使用することができます。

m = df.isnull().all(axis=1) | df.notnull().all(axis=1) 
print (m) 
1  True 
2 False 
3  True 
4  True 
dtype: bool 

print (df[m]) 
    v1 v2 
1 1.0 2.0 
3 2.0 4.0 
4 NaN NaN 

df[m] = df[m].ffill() 
print (df) 
    v1 v2 
1 1.0 2.0 
2 NaN 3.0 
3 2.0 4.0 
4 2.0 4.0 

EDIT:

print (df) 
    v1 v2 
1 1.0 2.0 
2 NaN 7.0 
3 4.0 8.0 
4 NaN NaN 
5 2.0 4.0 
6 NaN 3.0 
7 NaN NaN 

m = df.isnull().all(axis=1) | df.notnull().all(axis=1) 
print (m) 
1  True 
2 False 
3  True 
4  True 
5  True 
6 False 
7  True 
dtype: bool 

long_str = 'some long helper str' 
df[~m] = df[~m].fillna(long_str) 
df = df.ffill().replace(long_str, np.nan) 

print (df) 
    v1 v2 
1 1.0 2.0 
2 NaN 7.0 
3 4.0 8.0 
4 4.0 8.0 
5 2.0 4.0 
6 NaN 3.0 
7 NaN 3.0 
+0

なぜマスクの条件で 'df.notnull()。all(axis = 1)'を指定するのですか? – SirC

+1

これは、 'NAN'の行のみに一致し、ffillは動作しないためです。 – jezrael

+0

いくつかの問題がありますか?解決策は機能しませんか? – jezrael

関連する問題