【问题标题】:how to find the three largest values in a data frame?如何找到数据框中的三个最大值?
【发布时间】:2017-01-18 08:19:08
【问题描述】:

问题中的数据集:

对于上图中显示的数据集,我试图找到人口最多的三个州,同时只考虑每个州的三个人口最多的县。我用CENSUS2010POP

这个函数应该返回一个字符串值列表(按照人口最多到最低的顺序)。

以下是我的代码:

x=census_df.groupby('STNAME')['CENSUS2010POP'].nlargest(3)

此语句返回一个序列,其中将每个州的三个人口最多的县分组。

现在,除此之外我还能做些什么来进一步找到人口最多的州?

我是使用循环还是有其他有效的方法来解决这个问题?

【问题讨论】:

    标签: python python-3.x pandas dataframe group-by


    【解决方案1】:

    尝试将 sum() 添加到函数中:

    df = pd.DataFrame({'STNAME': ['Alabama', 'Alabama', 'Alabama', 'Alabama', 'Alaska', 'Alaska', 'Alaska', 'Alaska','New York', 'New York', 'New York', 'New York', 'California'], 
                       'CTYNAME': ['a', 'b', 'c', 'd', 'z', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'], 
                       'CENSUS2010POP': [120000, 230000, 89000, 43000, 23000, 34000, 120000, 10000, 1200000, 1300000, 9800000, 560000, 45000]})
    
    x=df.groupby('STNAME')['CENSUS2010POP'].sum().nlargest(3)
    

    输出:

    STNAME
    New York    12860000
    Alabama       482000
    Alaska        187000
    Name: CENSUS2010POP, dtype: int64
    

    【讨论】:

      【解决方案2】:
      def answer_six():
          county = census_df[census_df['SUMLEV']==50]
          states = county.groupby('STNAME')['CENSUS2010POP'].apply(lambda x: x.nlargest(3).sum()).nlargest(3).index.values.tolist()
      
          return states
      answer_six()
      

      【讨论】:

        【解决方案3】:

        以下是我对此的看法。我知道不推荐使用 iteraion 生成数据框,所以如果有更好的建议,请分享。

        fulldf3 = pd.DataFrame()
        for i in census_df['STNAME'].unique():
            top3=census_df[(census_df['STNAME']==i) & (census_df['SUMLEV']==50)].groupby(['STNAME','CTYNAME'])['CENSUS2010POP'].sum().nlargest(3)
            dftop3=pd.DataFrame(top3)
            fulldf3=fulldf3.append(dftop3)
        
        #gives the top3 states with population sum from top3 populous counties
        fulldf3['CENSUS2010POP'].sum(level=0).nlargest(3)
        
        #gives the names of the states in a list of strings
        fulldf3['CENSUS2010POP'].sum(level=0).nlargest(3).index.to_list()
        
        

        输出:

        • 加利福尼亚州 15924150
        • 德克萨斯州 8269632
        • 伊利诺伊州 6815061

        【讨论】:

        • 此答案考虑了 SUMLEV 的含义,并发现仅根据每个州的三个人口最多的县计算人口最多的三个州。
        【解决方案4】:
        def answer_six():
            lst=[];
            df=census_df.groupby(['STNAME'])
            df=df.sum()
            for i in range(3):
                fd=df['CENSUS2010POP'].max()
                df_temp=df[df['CENSUS2010POP']==fd]
                lst.append(df_temp.index[0])
        
                df=df.drop(df_temp.index[0],axis=0)
            return lst
        answer_six()
        

        【讨论】:

          【解决方案5】:

          temp 提供州和县的数据(也保持 SUMLEV 标准)

          tempo 为每个州提供前 3 个县

          temp = census_df[census_df.SUMLEV==50].groupby(['STNAME','CTYNAME']).agg({"CENSUS2010POP":sum})
          tempo = pd.DataFrame(temp['CENSUS2010POP'].groupby(level=0, group_keys=False).nlargest(3))
          tempo.CENSUS2010POP.groupby(level=0, group_keys=False).sum().nlargest(3).index.tolist()
          

          输出

          STNAME
          California    37253956
          Texas         25145561
          New York      19378102
          Name: CENSUS2010POP, dtype: int64
          

          【讨论】:

            猜你喜欢
            • 2020-06-12
            • 2017-10-11
            • 2011-01-15
            • 2014-08-04
            • 2013-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-26
            相关资源
            最近更新 更多