numpy 如何保留一列中的所有值,如果除它们之外的列至少有一个NOT_nan值

tez616oj  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(147)

我有一个类似的 Dataframe ,有两列

import pandas as pd
import numpy as np 
df=pd.DataFrame({'id_col':sorted([1,2,3]*2),'rate':[np.nan,np.nan,np.nan,5,np.nan,9]})

我有的是
| id_col|速率|
| - ------|- ------|
| 1个|钠氮|
| 1个|钠氮|
| 第二章|钠氮|
| 第二章|5.0版|
| 三个|钠氮|
| 三个|9.0分|
我想要的是
| id_col|速率|
| - ------|- ------|
| 第二章|钠氮|
| 第二章|5.0版|
| 三个|钠氮|
| 三个|9.0分|
我想保留至少有1个非NaN值的所有id_col值
有什么想法吗?

ct2axkht

ct2axkht1#

您可以使用布尔掩码并使用transform将布尔掩码广播给组中的其他成员:

m = df.groupby('id_col')['rate'].transform(max).notna()
out = df[m]

注意:你有很多方法可以实现这一点,但很多都使用了groupby_transform
输出:

>>> out
   id_col  rate
2       2   NaN
3       2   5.0
4       3   NaN
5       3   9.0

详情:

>>> pd.concat([df, m.rename('mask')], axis=1)
   id_col  rate   mask
0       1   NaN  False  # False because the max is null (NaN)
1       1   NaN  False
2       2   NaN   True  # True because the max is non null (5)
3       2   5.0   True
4       3   NaN   True  # True because the max is non null (9)
5       3   9.0   True
6l7fqoea

6l7fqoea2#

您可以使用first_valid_indexnotna来创建布尔掩码,然后对 Dataframe 进行子集化。

df[df.groupby('id_col')['rate'].transform(pd.Series.first_valid_index).notna()]

输出:

id_col  rate
2       2   NaN
3       2   5.0
4       3   NaN
5       3   9.0

相关问题