Python 熊猫根据数据框中的另一列填充NA的增量值

Python 熊猫根据数据框中的另一列填充NA的增量值,python,pandas,numpy,dataframe,pandas-groupby,Python,Pandas,Numpy,Dataframe,Pandas Groupby,我有一个数据框架,每个用户都有会话。其中一个专栏是sessions至今。其中一些会话具有空值。我相信我可以使用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]

我有一个数据框架,每个用户都有会话。其中一个专栏是sessions至今。其中一些会话具有空值。我相信我可以使用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之前,我没有针对每个用户返回的数据

假设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)
输出

fun函数的第一行相当于:

diff = (~x.reset_index().isna()).idxmax()[1]
基本上从0索引开始在规范化的索引中查找索引位置。

您可以使用groupby cumcount和first重新构造会话


谢谢你能详细说明一下它是如何工作的吗?diff=~x.reset\u index.isna.idxmax……对熊猫来说有点陌生。
diff = (~x.reset_index().isna()).idxmax()[1]
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