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

Pandas聚合分组与另一列的最大值?

  •  0
  • rb612  · 技术社区  · 6 年前

    目前,我正在使用COVID数据集进行深入研究。

        Country Province    Lat Lon         Date                    Cases   Status
    0   Thailand        15.0000 101.0000    2020-01-22 00:00:00+00:00   2   confirmed
    1   Thailand        15.0000 101.0000    2020-01-23 00:00:00+00:00   3   confirmed
    2   Thailand        15.0000 101.0000    2020-01-24 00:00:00+00:00   5   confirmed
    3   Thailand        15.0000 101.0000    2020-01-25 00:00:00+00:00   7   confirmed
    4   Thailand        15.0000 101.0000    2020-01-26 00:00:00+00:00   8   confirmed
    

    我想按国家分组,在“Cases”列上求和(我们称之为case sum列),但我遇到了经纬度问题:我想取case列max的lat/long。换言之,我想从经纬度与行最多的情况。为了澄清,用例是像法国这样的国家有多个纬度和经度的行(例如法属波利尼西亚),但是我只想从案例最多的区域中获取分组中的lat/long。

    我当前正在运行一个聚合,如下所示:

    nonzero_cases[(nonzero_cases['Date'] == "03/13/2020")].groupby("Country").agg({"Lat":"first","Lon":"first","Cases":"sum"})
    

    这将产生:

    Country     Lat     Lon     Cases
    Afghanistan 33.0000 65.0000 7
    Albania 41.1533 20.1683 33
    Algeria 28.0339 1.6596  26
    Andorra 42.5063 1.5218  1
    ...
    

    但这并不完全是我想要的,因为它没有考虑到病例号,只是选择了第一个纬度/经度。

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

    添加 DataFrame.sort_values 按列 Cases 案例

    print (df)
        Country   Lat    Lon                       Date  Cases     Status
    0  Thailand  15.0  101.0  2020-01-22 00:00:00+00:00      2  confirmed
    1  Thailand  15.0  101.0  2020-01-23 00:00:00+00:00      3  confirmed
    2  Thailand  15.0  101.0  2020-01-24 00:00:00+00:00      5  confirmed
    3  Thailand  15.0  101.0  2020-01-25 00:00:00+00:00      7  confirmed
    4  Thailand  14.0  103.0  2020-01-26 00:00:00+00:00      8  confirmed <- changed data
    
    df1 = (df.sort_values('Cases', ascending=False)
             .groupby("Country")
             .agg({"Lat":"first","Lon":"first","Cases":"sum"}))
    
    print (df1)
               Lat    Lon  Cases
    Country                     
    Thailand  14.0  103.0     25
    
        2
  •  1
  •   David Erickson    6 年前

    一个比耶斯雷尔更混乱的回答,但它完成了任务。不幸的是,groupby,np.where,.loc,当然还有pd.merge是我50%的熊猫的目标。

    nonzero_cases_agg = (nonzero_cases.groupby("Country")
                         .agg({"Cases":["sum","max"]}).reset_index())
    df = pd.merge(nonzero_cases, nonzero_cases_agg, how='left', on='Country')
    df = df.loc[df['Cases'] == df[('Cases', 'max')]].copy()
    df['Cases'] = df[('Cases', 'sum')]
    df = df.drop([('Cases', 'max'), ('Cases', 'sum')], axis=1)
    df