代码之家  ›  专栏  ›  技术社区  ›  npross

在熊猫数据帧中选择和使用重复行

  •  1
  • npross  · 技术社区  · 6 年前

    我有以下数据作为熊猫数据框架的一部分,df::

      qsoName,filterID,aperMag 
    0 PSOJ000,3,+19.284586
    1 PSOJ007,2,+20.334393
    2 PSOJ007,3,+20.226970
    3 PSOJ007,4,+20.288778   
    4 PSOJ007,5,+20.189209
    5 PSOJ011,2,+21.037594
    6 PSOJ011,4,+20.642813            
    7 PSOJ011,5,+20.760576 
    

    我想选出 df['aperMag'] 对于一个值 df['qsoName'] ,默认值为-999.99999,例如

     PSOJ000,-999.99999,+19.284586,-999.99999,-999.99999
     PSOJ007,+20.334393,+20.226970,+20.288778,+20.189209
     PSOJ011,+21.037594,-999.99999,+20.642813,+20.760576 
    

    这感觉就像 df["qsoName"].duplicated() 应该可以,但数据帧的重新格式化是另一个关键部分。

    1 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    使用 DataFrame.pivot 具有 DataFrame.fillna :

    df = df.pivot('qsoName','filterID','aperMag').fillna(-999.99999)
    

    set_index 具有 unstack 参数 fill_value :

    df = df.set_index(['qsoName','filterID'])['aperMag'].unstack(fill_value=-999.99999)
    

    print (df)
    filterID           2           3           4           5
    qsoName                                                 
    PSOJ000  -999.999990   19.284586 -999.999990 -999.999990
    PSOJ007    20.334393   20.226970   20.288778   20.189209
    PSOJ011    21.037594 -999.999990   20.642813   20.760576
    

    最后,如有必要:

    df = df.reset_index().rename_axis(None,axis=1)
    print (df)
       qsoName           2           3           4           5
    0  PSOJ000 -999.999990   19.284586 -999.999990 -999.999990
    1  PSOJ007   20.334393   20.226970   20.288778   20.189209
    2  PSOJ011   21.037594 -999.999990   20.642813   20.760576
    

    编辑:

    问题是一些数据对( qsoName , filterID )是重复的,所以需要 pivot_table :

    df = df.pivot_table(index='qsoName',
                        columns='filterID', 
                        values='aperMag', 
                        fill_value=-999.99999, 
                        aggfunc='mean')