Pandas Dataframe 获得每组的最小NaN和最小非NaN行

cu6pst1q  于 2022-12-28  发布在  其他
关注(0)|答案(2)|浏览(147)

Pandas Dataframe 获得每组的最小NaN和最小非NaN行
下面是我的数据框:

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在'值'列。
预期产出:

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]})

方法:
输出= df [df.索引==(df ["值"].非空().分组依据(df ["标识"]).转换("idxmax"))]

    • 问题:以下(idxmin不工作)**
df['value'].isnull().groupby(df['id']).transform('idxmin')
rlcwz9us

rlcwz9us1#

    • 示例**
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]})

第一个月

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
eit6fx6z

eit6fx6z2#

您也可以不分组地使用drop_duplicates

df.assign(blank = df['value'].isna()).drop_duplicates(['id','blank']).drop('blank', axis=1)

输出:

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

相关问题