Заполните последовательные NaNs с суммой - PullRequest
0 голосов
/ 27 декабря 2018

В указанном информационном кадре много пропущенных значений с определенным инвертированием:

Дано:

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 голосов
/ 27 декабря 2018

Другой подход?

данные

   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

print (data)

   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
0 голосов
/ 27 декабря 2018

Использование:

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
...