我想回填fillna,但是我只想回填一个na值,并用特定值(1)替换该值
我尝试使用
for(i<-1 to columns.length)
df1 = df1.withColumn(columns(i-1),'value.getItem(i-1))
+---+---------+---+---+-----+
| id| value|cat|dog|sheep|
+---+---------+---+---+-----+
| 1|[A, B, C]| A| B| C|
| 2|[D, E, F]| D| E| F|
+---+---------+---+---+-----+
但我明白了
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
我已经待了几个小时了。任何事情都值得赞赏!
答案 0 :(得分:2)
显然,ffill
无法同时指定value
和method
。这是另一种方法:
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
答案 1 :(得分:2)
您可以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