【问题标题】:Python pandas multiindex select valuesPython pandas 多索引选择值
【发布时间】:2018-02-12 18:21:47
【问题描述】:

我有一个 pandas 多索引,其中大部分是数值,但数据中也有一些 None、NaN 或“-”。像这样的:

                0         1         2         3
bar one -0.096648 -0.080298  0.859359 -0.030288
    two       NaN -0.431791  1.923893 -1.544845
    thr -0.358526  1.416211  1.589617  0.284130
baz one  0.639951 -0.008833         -  0.042315
    two  0.705281      None -1.108522  0.471676

现在我需要为每个 0 级索引确定哪一行在第 0 列中具有最小的数值,并为该行提取第 3 列的值。 (忽略 NaN、None 和 -)

例如,对于“bar”,我比较 -0.096648、NaN、-0.358526,其中最小的是 -0.358526,所以我想要值 0.284130(来自第 3 列)

我确信这很简单,但我对这些多索引表不是很熟悉,只是迷失了方向并感到沮丧。

【问题讨论】:

    标签: python-3.x pandas multi-index


    【解决方案1】:

    使用DataFrameGroupBy.idxmin 作为索引,但首先需要一些预处理,然后通过DataFrame.iloc 选择:

    #get name for level of MultiIndex and create unique index
    df1 = df.rename_axis(('a','b')).reset_index()
    #if values non numeric in column 0 convert to NaNs
    df1[0] = pd.to_numeric(df1[0], errors='coerce')
    #get index of minimal values of column 0 per column a
    s = df1.groupby('a')[0].idxmin()
    print (s)
    a
    bar    2
    baz    3
    Name: 0, dtype: int64
    
    #select by positions index and column 3
    df = df.iloc[s, 3].to_frame()
    print (df)
                    3
    bar thr  0.284130
    baz one  0.042315
    

    【讨论】:

      猜你喜欢
      • 2017-11-20
      • 2020-12-21
      • 2021-10-24
      • 2020-09-05
      • 2020-11-15
      • 2023-03-26
      相关资源
      最近更新 更多