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

通过groupby计算平均值,删除一些带有布尔条件的行,然后以原始格式保存文件

  •  2
  • user96564  · 技术社区  · 6 年前

    我有这样的数据。

    enter image description here

    我计算每个身份证的平均数

    df.groupby(['ID'], as_index= False)['A'].mean()
    

    现在,我想删除那些平均值大于3的id

    df.drop(df[df.A > 3].index)
    

    就在这里,我累了。我想保存的文件,但在原始格式(没有分组和没有平均值)和没有那些ID的平均值超过3。 你知道我怎样才能做到这一点吗?输出类似这样的内容。另外,我想知道在使用drop时删除了多少唯一的id。

    enter image description here

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

    使用 transform 对于 Series 与原尺寸相同 DataFrame ,因此可以根据 > 3 <=3 通过 boolean indexing :

    df1 = df[df.groupby('ID')['A'].transform('mean') <= 3]
    print (df1)
    
       ID  A
    0   1  2
    1   1  3
    2   1  1
    6   3  6
    7   3  1
    8   3  1
    9   3  1
    

    细节 :

    print (df.groupby('ID')['A'].transform('mean'))
    
    0    2.000000
    1    2.000000
    2    2.000000
    3    6.666667
    4    6.666667
    5    6.666667
    6    2.250000
    7    2.250000
    8    2.250000
    9    2.250000
    Name: A, dtype: float64
    
    print (df.groupby('ID')['A'].transform('mean') <= 3)
    
    0     True
    1     True
    2     True
    3    False
    4    False
    5    False
    6     True
    7     True
    8     True
    9     True
    Name: A, dtype: bool
    
        2
  •  1
  •   Scott Boston    6 年前

    另一个解决方案使用 groupby filter . 此解决方案比使用带有布尔索引的转换要慢。

    df.groupby('ID').filter(lambda x: x['A'].mean() < 3)
    

    输出:

       ID  A
    0   1  2
    1   1  3
    2   1  1
    6   3  6
    7   3  1
    8   3  1
    9   3  1