用累积量填充连续的NaN

时间:2018-12-27 10:46:42

标签: pandas dataframe cumulative-sum

给定的数据框具有很多缺失值,并且存在一定的间隔:

给出:

shop_id calendar_date quantity
0       2018-12-12      1  
1       2018-12-13      NaN    
2       2018-12-14      NaN    
3       2018-12-15      NaN
4       2018-12-16      1
5       2018-12-17      NaN

所需的输出:

shop_id calendar_date quantity 
0       2018-12-12      1    
1       2018-12-13      2    
2       2018-12-14      3    
3       2018-12-15      4
4       2018-12-16      1
5       2018-12-17      2

所需的数据帧应将所有连续的NaN用第一个有效值开始的cumsum填充,并为每个1添加NaN

非常感谢。

2 个答案:

答案 0 :(得分:1)

使用:

g = (~df.quantity.isnull()).cumsum()
df['quantity'] = df.fillna(1).groupby(g).quantity.cumsum()

      shop_id calendar_date  quantity
0        0    2018-12-12       1.0
1        1    2018-12-13       2.0
2        2    2018-12-14       3.0
3        3    2018-12-15       4.0
4        4    2018-12-16       1.0
5        5    2018-12-17       2.0

详细信息

使用.isnull()来检查quantity的有效值,并取布尔系列的cumsum

g = (~df.quantity.isnull()).cumsum()

0    1
1    1
2    1
3    1
4    2
5    2

使用fillna 这样,当您按g分组并采用cusmum时,值将从以下任何值开始增加:

df.fillna(1).groupby(g).quantity.cumsum()
0    1.0
1    2.0
2    3.0
3    4.0
4    1.0
5    2.0

答案 1 :(得分:0)

另一种方法?

数据

   shop_id calender_date  quantity
0        0    2018-12-12       1.0
1        1    2018-12-13       NaN
2        2    2018-12-14       NaN
3        3    2018-12-15       NaN
4        4    2018-12-16       1.0
5        5    2018-12-17       NaN
6        6    2018-12-18       NaN
7        7    2018-12-17       NaN

使用 np.where

where = np.where(data['quantity'] >= 1)

r = []
for i in range(len(where[0])):
    try:
        r.extend(np.arange(1,where[0][i+1] - where[0][i]+1))
    except:
        r.extend(np.arange(1,len(data)-where[0][i]+1))

data['quantity'] = r

打印(数据)

   shop_id calender_date  quantity
0        0    2018-12-12         1
1        1    2018-12-13         2
2        2    2018-12-14         3
3        3    2018-12-15         4
4        4    2018-12-16         1
5        5    2018-12-17         2
6        6    2018-12-18         3
7        7    2018-12-17         4