如果特定列的一个值为NaN,是否可以使用Ffill替换整个熊猫数据框行?

时间:2019-11-16 23:19:00

标签: python pandas dataframe

我正在尝试对某些行全部为NaN的数据框进行排序。我想使用填充填充这些。我目前正在尝试此操作,尽管我感觉这是一些命令的不匹配

df.loc[df['A'].isna(), :] = df.fillna(method='ffill')

这给出了一个错误:  AttributeError: 'NoneType' object has no attribute 'fillna'

但是如果列之一是NaN,我想用填充填充过滤的NaN。即

     A    B      C     D   E
0   45    88    NaN   NaN  3
1   62    34    2     86   NaN
2   85    65    11    31   5
3   NaN   NaN   NaN   NaN  NaN
4   90    38    34    93   8
5    0    94    45    10   10
6   58    NaN   23    60   11
7   10    32     5    15   11
8   NaN   NaN   NaN   NaN  NaN

所以我只想填充IFF行,A的值为NaN,而C,0和D,0保留为NaN。提供以下数据框

     A    B      C     D   E
0   45    88    NaN   NaN  3
1   62    34    2     86   NaN
2   85    65    11    31   5
3   85    65    11    31   5
4   90    38    34    93   8
5    0    94    45    10   10
6   58    NaN   23    60   11
7   10    32     5    15   11
8   10    32     5    15   11

因此,为了澄清起见,仅用ffill替换的行是3,8,原因是因为第3行和第8行中的A列的值为NaN 谢谢

---更新--- 在调试并评估表达式时:df.loc[df['A'].isna(), :]

我知道

3   NaN   NaN   NaN   NaN  NaN
8   NaN   NaN   NaN   NaN  NaN

所以我假设这里发生了什么,然后我尝试对仅包含3和8的新数据帧进行填充,显然我无法用NaN填充NaN。

3 个答案:

答案 0 :(得分:1)

仅将值更改为以nan开头的行

df.loc[df['A'].isna(), :] = df.ffill().loc[df['A'].isna(), :]

      A     B     C     D     E
0  45.0  88.0   NaN   NaN   3.0
1  62.0  34.0   2.0  86.0   NaN
2  85.0  65.0  11.0  31.0   5.0
3  85.0  65.0  11.0  31.0   5.0
4  90.0  38.0  34.0  93.0   8.0
5   0.0  94.0  45.0  10.0  10.0
6  58.0   NaN  23.0  60.0  11.0
7  10.0  32.0   5.0  15.0  11.0
8  10.0  32.0   5.0  15.0  11.0

答案 1 :(得分:1)

尝试使用掩码标识列A为空的相关行。从向前填充的数据框中获取相同的行。

mask = df['A'].isnull()
df.loc[mask, :] = df.ffill().loc[mask, :]
>>> df
      A     B     C     D     E
0  45.0  88.0   NaN   NaN   3.0
1  62.0  34.0   2.0  86.0   NaN
2  85.0  65.0  11.0  31.0   5.0
3  85.0  65.0  11.0  31.0   5.0
4  90.0  38.0  34.0  93.0   8.0
5   0.0  94.0  45.0  10.0  10.0
6  58.0   NaN  23.0  60.0  11.0
7  10.0  32.0   5.0  15.0  11.0
8  10.0  32.0   5.0  15.0  11.0

答案 2 :(得分:0)

您只想填充(DataFrame.ffill,在其中DataFrame.wheredf['A']nan,其余部分则照旧填写(< strong> df ):

df=df.ffill().where(df['A'].isna(),df)
print(df)
      A     B     C     D     E
0  45.0  88.0   NaN   NaN   3.0
1  62.0  34.0   2.0  86.0   NaN
2  85.0  65.0  11.0  31.0   5.0
3  85.0  65.0  11.0  31.0   5.0
4  90.0  38.0  34.0  93.0   8.0
5   0.0  94.0  45.0  10.0  10.0
6  58.0   NaN  23.0  60.0  11.0
7  10.0  32.0   5.0  15.0  11.0
8  10.0  32.0   5.0  15.0  11.0