熊猫水平填充NA值,但仅限于一个正向填充值

时间:2019-09-27 07:27:31

标签: python-3.x pandas

我想水平向前填充值,但仅限于一个填充值。

请参阅以下框架:dfa有一些空白需要填补。我想要的结果如dfb所示。

(请注意行尾的.T,将数据水平转置。)

但是,dfa.fillna(0, limit=1, axis=1)填充了Name行中的所有单元格,而第5列和第6列(即7行中Name左侧的两列)应该保持NaN。

import pandas as pd
import numpy as np
dfa = pd.DataFrame({'Name':[1,      np.nan,      3, np.nan, np.nan, np.nan,      7, np.nan], 
                    'Age': [np.nan,      2, np.nan,      4, np.nan,      6, np.nan,      8]}).T
dfb = pd.DataFrame({'Name':[1,           0,      3,      0, np.nan, np.nan,      7,      0],                
                    'Age': [np.nan,      2,      0,      4,      0,      6,      0,      8]}).T
dfc = dfa.fillna(0, limit=1, axis=1)

1 个答案:

答案 0 :(得分:2)

一个想法是使用正向填充蒙版,然后用&替换为DataFrame.mask链接条件:

m = dfa.ffill(limit=1, axis=1).isna()
print (m)
          0      1      2      3      4      5      6      7
Name  False  False  False  False   True   True  False  False
Age    True  False  False  False  False  False  False  False

dfc = dfa.mask(dfa.isna() & ~m, 0)

或者首先替换所有NaN,然后根据条件创建NaN

dfc = dfa.fillna(0).mask(m)

print (dfc)
        0    1    2    3    4    5    6    7
Name  1.0  0.0  3.0  0.0  NaN  NaN  7.0  0.0
Age   NaN  2.0  0.0  4.0  0.0  6.0  0.0  8.0