我正在尝试对某些行全部为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。
答案 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.where
)df['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