Панды заполняют инкрементные значения для NA согласно другому столбцу в DataFrame - PullRequest
0 голосов
/ 27 октября 2019

У меня есть датафрейм с сессиями для каждого пользователя. Одна из колонок - сессии до сих пор. Некоторые из этих сеансов имеют нулевые значения. Я считаю, что я мог бы использовать методы fillna и transform, чтобы соответствующим образом заполнить фрейм данных.

import pandas as pd

df = pd.DataFrame({'user': [A, A, A, A, A, B, B, B, B, C, C, C, C, C],  'sessions': [28, NaN, NaN, NaN , 32, NaN, NaN,NaN,12, NaN,15, NaN, 17,NaN]})

Ожидаемый выходной фрейм данных:

df_out = pd.DataFrame({'user': [A, A, A, A, A, B, B, B, B, C, C, C, C, C],  'sessions': [28, 29, 30, 31 , 32, 9, 10, 11,12, 14,15,16,17,18]})

Пробный код:

df['sessions'] = df['sessions'].fillna(df.groupby('user')['sessions'].transform('mean'))

Это работает, если я должен был заполнить среднее значение, и это насколько я могдумать. Пожалуйста, предложите несколько подходов.

PS - Начальное значение сеанса не 1. Я делаю это из моментального снимка в некоторый момент времени. У меня нет данных, возвращающихся до сессии № 1 для каждого пользователя.

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Предполагая, что нет несоответствия между значениями not NaN, вы можете сделать следующее:

def fun(x):
    _, diff = (~x.reset_index().isna()).idxmax()  # find the absolute position of the first non NaN

    start = x[(~x.isna()).idxmax()] - diff  # find the start value

    result = pd.RangeIndex(start, start + len(x))  # generate range based on first value and length of group

    return pd.Series(data=result.values, index=x.index)  # return series


df['count'] = df.groupby('user').sessions.apply(fun)

print(df)

Выход

   user  sessions  count
0     A      28.0     28
1     A       NaN     29
2     A       NaN     30
3     A       NaN     31
4     A      32.0     32
5     B       NaN      9
6     B       NaN     10
7     B       NaN     11
8     B      12.0     12
9     C       NaN     14
10    C      15.0     15
11    C       NaN     16
12    C      17.0     17
13    C       NaN     18

Первая строкафункции fun, эквивалентно:

diff = (~x.reset_index().isna()).idxmax()[1]

По сути, найти позицию индекса в нормализованном (начиная с 0) индексе.

0 голосов
/ 28 октября 2019

Вы можете восстановить sessions, используя groupby cumcount и first

s = df.groupby('user').sessions.cumcount()
s1 = (df.sessions - s).groupby(df.user).transform('first')

df['sessions'] = s1 + s

In [867]: df
Out[867]:
   user  sessions
0     A      28.0
1     A      29.0
2     A      30.0
3     A      31.0
4     A      32.0
5     B       9.0
6     B      10.0
7     B      11.0
8     B      12.0
9     C      14.0
10    C      15.0
11    C      16.0
12    C      17.0
13    C      18.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...