Python:Groupby第一个非NaN值

Python:Groupby第一个非NaN值,python,pandas,Python,Pandas,我有以下数据帧: id number 1 13 1 13 1 NaN 1 NaN 2 11 2 11 2 11 2 NaN 我想找到每个id的第一个非NaN值,并将其标记为1。结果应该如下所示: id number code 1 13 NaN 1 13 1 1 NaN NaN 1 NaN

我有以下数据帧:

id    number   
1      13
1      13
1      NaN
1      NaN
2      11
2      11
2      11
2      NaN
我想找到每个id的第一个非NaN值,并将其标记为1。结果应该如下所示:

id    number     code   
1      13         NaN
1      13         1
1      NaN        NaN
1      NaN        NaN
2      11         NaN
2      11         NaN
2      11         1
2      NaN        NaN
我尝试了以下命令,然后从那里开始:

df["test"] = df.groupby("id")["number"].first_valid_index()
它给了我以下错误:无法访问“SeriesGroupBy”对象的可调用属性“first\u valid\u index”,请尝试使用“apply”方法

然后我试了一下:

df['test'] = df.groupby("id")['number'].apply(lambda x: x.first_valid_index())
但这只给了我一列NAT


有人知道如何有效地解决问题吗?

假设您的意思是
last\u valid\u index
,您可以
应用
last\u valid\u index
函数和
loc
分配-

df.loc[df.groupby('id').number.apply(pd.Series.last_valid_index), 'code'] = 1
df

   id  number  code
0   1    13.0   NaN
1   1    13.0   1.0
2   1     NaN   NaN
3   1     NaN   NaN
4   2    11.0   NaN
5   2    11.0   NaN
6   2    11.0   1.0
7   2     NaN   NaN

或者,使用
groupby
+
idxmax
-

df.loc[df.number.notnull().cumsum().groupby(df.id).idxmax(), 'code'] = 1
df

   id  number  code
0   1    13.0   NaN
1   1    13.0   1.0
2   1     NaN   NaN
3   1     NaN   NaN
4   2    11.0   NaN
5   2    11.0   NaN
6   2    11.0   1.0
7   2     NaN   NaN

假设您的意思是
last\u valid\u index
,您可以
应用
last\u valid\u index
函数和
loc
分配-

df.loc[df.groupby('id').number.apply(pd.Series.last_valid_index), 'code'] = 1
df

   id  number  code
0   1    13.0   NaN
1   1    13.0   1.0
2   1     NaN   NaN
3   1     NaN   NaN
4   2    11.0   NaN
5   2    11.0   NaN
6   2    11.0   1.0
7   2     NaN   NaN

或者,使用
groupby
+
idxmax
-

df.loc[df.number.notnull().cumsum().groupby(df.id).idxmax(), 'code'] = 1
df

   id  number  code
0   1    13.0   NaN
1   1    13.0   1.0
2   1     NaN   NaN
3   1     NaN   NaN
4   2    11.0   NaN
5   2    11.0   NaN
6   2    11.0   1.0
7   2     NaN   NaN
你可以用这个

df.loc[df.groupby('id').apply(lambda x : x['number'].dropna()).reset_index(level=1)['level_1'].max(level=0),'code']=1
df
Out[628]: 
   id  number  code
0   1    13.0   NaN
1   1    13.0   1.0
2   1     NaN   NaN
3   1     NaN   NaN
4   2    11.0   NaN
5   2    11.0   NaN
6   2    11.0   1.0
7   2     NaN   NaN
你可以用这个

df.loc[df.groupby('id').apply(lambda x : x['number'].dropna()).reset_index(level=1)['level_1'].max(level=0),'code']=1
df
Out[628]: 
   id  number  code
0   1    13.0   NaN
1   1    13.0   1.0
2   1     NaN   NaN
3   1     NaN   NaN
4   2    11.0   NaN
5   2    11.0   NaN
6   2    11.0   1.0
7   2     NaN   NaN

看起来像是最后一个有效索引?看起来像是最后一个有效索引?@piRSquared-yes,修复它:-)@piRSquared-yes,修正它:-)如果一个组完全是
NaN
?@BallpointBen我想它会错误地将1分配给组中的最后一行。如果一个组完全是
NaN
?@BallpointBen我想它会错误地将1分配给组中的最后一行。