如何用一个特定值只填充一个na值

2024-04-27 04:01:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想返回fillna,但我只想回填一个na值,并用一个特定值(1)替换该值

我试过用

df.fillna(value=1,method='bfill',inplace=True,limit=1)

但我明白了

ValueError: Cannot specify both 'value' and 'method'.

因为我不能同时使用方法和值。如果这是可能的,我将不会问这个问题(熊猫可能应该研究一个新的更新)

举个例子:

import pandas as pd
import numpy as np

col1 = [3,2,2,np.nan,np.nan,np.nan,2,6,np.nan,np.nan,np.nan,6]
col2 = [8,2,np.nan,np.nan,6,0,np.nan,5,np.nan,6,6,3]
col3 = [np.nan,np.nan,np.nan,np.nan,6,7,np.nan,1,np.nan,np.nan,3,4]
df = pd.DataFrame(data=[col1,col2,col3],columns=['col1','col2','col3'])

print(df)

index     col1     col2     col3
0          3        8       np.nan
1          2        2       np.nan
2          2        np.nan  np.nan
3          np.nan   np.nan  np.nan
4          np.nan   6       6
5          np.nan   0       7
6          2        np.nan  np.nan
7          6        5       1
8          np.nan   np.nan  np.nan
9          np.nan   6       np.nan
10         np.nan   6       3
11         6        3       4

这是我想要的结果:

index     col1     col2     col3
0          3        8       np.nan
1          2        2       np.nan
2          2        np.nan  np.nan
3          np.nan   1       1
4          np.nan   6       6
5          1        0       7
6          2        1       1
7          6        5       1
8          np.nan   1       np.nan
9          np.nan   6       1
10         1        6       3
11         6        3       4

我已经干了好几个小时了。任何事都值得感激!你知道吗


Tags: importdfindexvalueasnpnanmethod
2条回答

显然ffill无法同时指定valuemethod。以下是另一种方法:

m = (df.isna() & df.shift(-1).notna()).shift().fillna(False)
pd.DataFrame(np.where(m, 1, df), columns=df.columns)

     col1  col2  col3
0    3.0   8.0   NaN
1    2.0   2.0   NaN
2    2.0   NaN   NaN
3    NaN   1.0   1.0
4    NaN   6.0   6.0
5    1.0   0.0   7.0
6    2.0   5.0   1.0
7    6.0   5.0   1.0
8    NaN   6.0   NaN
9    NaN   6.0   1.0
10   1.0   6.0   3.0
11   6.0   3.0   4.0

你可以bfill用限制1,不管哪个值。然后检查哪个值已填充,但仍然NaN在原始数据帧中。您填写的索引1

d = df.bfill(limit=1)
mask = df.isna() & d.notna()

df = pd.DataFrame(np.where(mask, 1, df), columns=df.columns)

输出

    col1  col2  col3
0    3.0   8.0   NaN
1    2.0   2.0   NaN
2    2.0   NaN   NaN
3    NaN   1.0   1.0
4    NaN   6.0   6.0
5    1.0   0.0   7.0
6    2.0   1.0   1.0
7    6.0   5.0   1.0
8    NaN   1.0   NaN
9    NaN   6.0   1.0
10   1.0   6.0   3.0
11   6.0   3.0   4.0

相关问题 更多 >