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

groupby后的Pandas键错误

  •  0
  • Giles  · 技术社区  · 4 年前

    在这里,我想在获取一个数据帧之后,对一个数据进行过滤,但我想在一个代码之后完成一个数据过滤:

    
    df = pd.DataFrame([
                    [0, 1, 'm', 5.0], [0, 1, 'm', -7.0],[0, 1, 'm', 9.0],[0, 1, 'm', 32.0],[0, 1, 'm', -11.0],
                    [0, 6, 'm', -12.0], [0, 6, 'm', 15.0],[0, 6, 'm', -16.0],[0, 6, 'm', -3.0],[0, 6, 'm', 21.0],
                    [0, 12, 'm', 15.0], [0, 12, 'm', 51.0],[0, 12, 'm', 4.0],[0, 12, 'm', 3.0],[0, 12, 'm', 1.0],
                    [1, 1, 'm', 5.0], [1, 1, 'm', -7.0],[1, 1, 'm', 9.0],[1, 1, 'm', 32.0],[1, 1, 'm', -11.0],
                    [1, 6, 'm', -12.0], [1, 6, 'm', 15.0],[1, 6, 'm', -16.0],[1, 6, 'm', -3.0],[1, 6, 'm', 21.0],
                    [1, 12, 'm', 15.0], [1, 12, 'm', 51.0],[1, 12, 'm', 4.0],[1, 12, 'm', 3.0],[1, 12, 'm', 1.0]
                    ],
                    columns=['id', 'timeperiod', 'timeperiodtype', 'value'])
    df['good'] = df['value'].apply(lambda x: 1 if x>0 else 0)
    print(df)
    print(df[df['timeperiod']>6])
    
    df = df[['id', 'timeperiod','timeperiodtype','good']][df['timeperiod']>0].groupby(['id','timeperiod','timeperiodtype']).mean()
    
    print(df[df['timeperiod']>6])
    

    我想避免使用reset_index,因为在最后的代码中,我将有几个形状相似的数据帧,我将聚合/合并/连接这些数据帧。

    如何使用列名筛选分组数据帧?

    谢谢。

    1 回复  |  直到 4 年前
        1
  •  1
  •   jezrael    4 年前

    使用 DataFrame.loc 先按条件过滤,再按列名过滤,再按避免过滤 MultiIndex DataFrame.reset_index 或参数 as_index=False

    df = df.loc[df['timeperiod']>0, ['id', 'timeperiod','timeperiodtype','good']].groupby(['id','timeperiod','timeperiodtype']).mean().reset_index()
    

    或者:

    df = df.loc[df['timeperiod']>0, ['id', 'timeperiod','timeperiodtype','good']].groupby(['id','timeperiod','timeperiodtype'], as_index=False).mean()
    

    print(df)
       id  timeperiod timeperiodtype  good
    0   0           1              m   0.6
    1   0           6              m   0.4
    2   0          12              m   1.0
    3   1           1              m   0.6
    4   1           6              m   0.4
    5   1          12              m   1.0
    
    print(df[df['timeperiod']>6])
       id  timeperiod timeperiodtype  good
    2   0          12              m   1.0
    5   1          12              m   1.0
    

    编辑:

    用于过滤器输入 MuiltiIndex 是可能的用途 Index.get_level_values :

    df = df.loc[df['timeperiod']>0, ['id', 'timeperiod','timeperiodtype','good']].groupby(['id','timeperiod','timeperiodtype']).mean()
    print(df)
                                  good
    id timeperiod timeperiodtype      
    0  1          m                0.6
       6          m                0.4
       12         m                1.0
    1  1          m                0.6
       6          m                0.4
       12         m                1.0
       
    print(df[df.index.get_level_values('timeperiod')>6])
                                  good
    id timeperiod timeperiodtype      
    0  12         m                1.0
    1  12         m                1.0