首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python pandas仅填充具有特定值的一行

Python pandas仅填充具有特定值的一行
EN

Stack Overflow用户
提问于 2016-02-03 21:15:28
回答 3查看 11.8K关注 0票数 3

编辑:

我有一个(不是非常简单的)数据框架:

代码语言:javascript
复制
df = pd.DataFrame([1, 2, np.nan, np.nan, np.nan, np.nan, 3, 4
    , np.nan, np.nan, np.nan, 5], columns=['att1'])

     att1
0  1.0000
1  2.0000
2     nan
3     nan
4     nan
5     nan
6  3.0000
7  4.0000
8     nan
9     nan
10    nan
11 5.0000

我想用前一个非NAN值填充NAN值,但最后一个NAN值除外。我希望填充后的最后一个NAN值为NAN。我该怎么做呢?

我想要这样的结果:

代码语言:javascript
复制
     att1
0  1.0000
1  2.0000
2  2.0000
3  2.0000
4  2.0000
5     nan
6  3.0000
7  4.0000
8  4.0000
9  4.0000
10    nan
11 5.0000

我试过这个:

代码语言:javascript
复制
df = df.fillna(value='missing', method='bfill', limit=1)
df = df.fillna(method='ffill')

但是第一行给出了这个错误:

代码语言:javascript
复制
ValueError: cannot specify both a fill method and value

为什么pandas 0.17.1 / Python 3.5会有这个限制?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-03 21:20:51

您可以在df['att1']中计算NaN,减去1,然后将其用作fillna的参数limits

代码语言:javascript
复制
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

编辑:

现在它变得更加复杂了。

因此首先设置辅助列count,用于通过isnullshiftastypecumsum对列att1的连续值进行计数。然后按此列countfillna执行groupby

代码语言:javascript
复制
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
代码语言:javascript
复制
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

代码语言:javascript
复制
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
代码语言:javascript
复制
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
代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2016-02-03 22:27:34

另一种可能不太复杂的替代方法是创建一个索引点列表,您希望在这些索引点上有NaNs (其中索引点不是null,但之前的索引点是null)。然后,您只需向前填充您的数据,并使用您创建的列表重新插入NaNs。

代码语言:javascript
复制
import pandas as pd
import numpy as np
from numpy import nan as NA
df = pd.DataFrame([1, 2, np.nan, np.nan, np.nan, np.nan, 3, 4
    , np.nan, np.nan, np.nan, 5], columns=['att1'])

#create list of index points where you want NaNs to be be
Nan_ind = [x - 1 for x in xrange(1, df.index[-1] + 1) 
                if pd.notnull(df.loc[x, 'att1'])
                and pd.isnull(df.loc[x-1, 'att1'])]

#forward fillna             
df['att1'] = df['att1'].fillna(method = 'ffill')

#reinsert NaNs using your list of index points
df.loc[Nan_ind, 'att1'] = NA
票数 1
EN

Stack Overflow用户

发布于 2018-07-09 04:27:56

用“NaN”填充所有的缺失。最后一个“缺失”,你可以用NaN代替。

代码语言:javascript
复制
df['att1'].fillna("missing",inplace=True)
df.iloc[[-2]].replace("missing",NaN)

反向使用负值作为iloc搜索索引。返回-2 \f25 'att1‘-2列的-2\f25 forelast -2\f6元素的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35178117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档