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分配给组中的最后一行。