只有当整条线由Nan组成时才向前填充Pandas df

时间:2017-09-11 14:44:26

标签: python pandas dataframe

我想仅在当前行完全由nan组成时才向前一行填充pandas df。 这意味着fillna(method='ffill', limit = 1)在我的情况下不起作用,因为它在元素方面有效,而我需要fillna行。{/ p>

有没有比以下说明更优雅的方式来完成这项任务?

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 个答案:

答案 0 :(得分: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

编辑:

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