[英]Keep the first n non NaN cells in each row of a pandas DataFrame
[英]Pandas dataframe get smallest NaN and smallest not NaN row for each group
Pandas dataframe 為每個組獲取最小的 NaN 和最小的非 NaN 行
下面是我的 dataframe:
df = pd.DataFrame({'id' : [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],
'vd' : [1, 2, 3, 4, 5, 2, 3, 4, 5, 6,
3, 4, 5, 6, 7],
'value' : [np.NaN, np.NaN, np.NaN, 2.3, 1.1,
np.NaN, np.NaN, 2.2, 3.3, 2.2,
np.NaN, 1, 2, 2.3, 1.1]})
我希望過濾具有最小“vd”列和每個組的“值”中的 NaN 的行和最小的 vd 列,而不是“值”列中的 Nan。
預計 output:
df_out = pd.DataFrame({'id' : [1,1, 2,2, 3,3],
'vd' : [1, 4, 2, 4,
3, 4],
'value' : [np.NaN, 2.3,
np.NaN, 2.2,
np.NaN, 1]})
方法:
out = df[df.index == (df['value'].notnull().groupby(df['id']).transform('idxmax'))]
問題:低於(idxmin 不工作)
df['value'].isnull().groupby(df['id']).transform('idxmin')
例子
df = pd.DataFrame({'id' : [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],
'vd' : [1, 2, 3, 4, 5, 2, 3, 4, 5, 6,
3, 4, 5, 6, 7],
'value' : [np.NaN, np.NaN, np.NaN, 2.3, 1.1,
np.NaN, np.NaN, 2.2, 3.3, 2.2,
np.NaN, 1, 2, 2.3, 1.1]})
df
id vd value
0 1 1 NaN
1 1 2 NaN
2 1 3 NaN
3 1 4 2.3
4 1 5 1.1
5 2 2 NaN
6 2 3 NaN
7 2 4 2.2
8 2 5 3.3
9 2 6 2.2
10 3 3 NaN
11 3 4 1.0
12 3 5 2.0
13 3 6 2.3
14 3 7 1.1
代碼
如果像您的示例一樣按 id 和 vd 排序,則以下代碼最簡潔
out = df.groupby(['id', df['value'].isna()]).head(1).reset_index(drop=True)
out
id vd value
0 1 1 NaN
1 1 4 2.3
2 2 2 NaN
3 2 4 2.2
4 3 3 NaN
5 3 4 1.0
您也可以在不分組的情況下使用drop_duplicates
:
df.assign(blank = df['value'].isna()).drop_duplicates(['id','blank']).drop('blank', axis=1)
Output:
id vd value
0 1 1 NaN
3 1 4 2.3
5 2 2 NaN
7 2 4 2.2
10 3 3 NaN
11 3 4 1.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.