您可以在 df['att1']
中计算NaN
,然后减去1
,将其用作参数limits
传递给fillna
函数。
import pandas as pd
import numpy as np
df = pd.DataFrame([1, 2, np.nan, np.nan, np.nan, np.nan, 3] , columns=['att1'])
print df
att1
0 1
1 2
2 NaN
3 NaN
4 NaN
5 NaN
6 3
s = df['att1'].isnull().sum() - 1
df['att1'] = df['att1'].fillna('missing', limit=s)
print df
att1
0 1
1 2
2 missing
3 missing
4 missing
5 NaN
6 3
编辑:
现在情况更加复杂。
首先,通过使用isnull
、shift
、astype
和cumsum
设置辅助列count
来计算列att1
的连续值。然后按照这个列count
进行groupby
并使用fillna
填充数据:
import pandas as pd
import numpy as np
df = pd.DataFrame([1, 2, np.nan, np.nan, np.nan, np.nan, 3, 4
, np.nan, np.nan, np.nan, 5], columns=['att1'])
print df
df['count'] = (df['att1'].isnull() != df['att1'].isnull().shift()).astype(int).cumsum()
print df
att1 count
0 1 1
1 2 1
2 NaN 2
3 NaN 2
4 NaN 2
5 NaN 2
6 3 3
7 4 3
8 NaN 4
9 NaN 4
10 NaN 4
11 5 5
def f(x):
att = x['att1'].isnull()
if(att.all()):
return x['att1'].fillna('missing', limit=att.sum() - 1)
else:
return x['att1']
print df.groupby(['count']).apply(f).reset_index(drop=True)
0 1
1 2
2 missing
3 missing
4 missing
5 NaN
6 3
7 4
8 missing
9 missing
10 NaN
11 5
Name: att1, dtype: object
解释列
count
:
该列用于计算查询结果中的行数。
print (df['att1'].isnull() != df['att1'].isnull().shift())
0 True
1 False
2 True
3 False
4 False
5 False
6 True
7 False
8 True
9 False
10 False
11 True
Name: att1, dtype: bool
print (df['att1'].isnull() != df['att1'].isnull().shift()).astype(int)
0 1
1 0
2 1
3 0
4 0
5 0
6 1
7 0
8 1
9 0
10 0
11 1
Name: att1, dtype: int32
print (df['att1'].isnull() != df['att1'].isnull().shift()).astype(int).cumsum()
0 1
1 1
2 2
3 2
4 2
5 2
6 3
7 3
8 4
9 4
10 4
11 5
Name: att1, dtype: int32
df.fillna(value='missing', limit=3)
? - EdChumdf
,但是我在我的数据帧中有几个NAN
块,所以我不知道forward
的limit
,只知道backward
的limit
是1
。 - ragesz