如何在数据框中找到三个最大值?

时间:2017-01-18 08:19:08

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

数据集问题:

enter image description here

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

此函数应返回字符串值列表(按最高人口到最低人口的顺序)。

以下是我的代码:

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

该声明返回一个系列,其中它将每个州的三个人口最多的县分组。

现在,我还能做些什么才能进一步找到人口最多的州?

我是否使用循环或是否有另一种有效的方法来解决这个问题?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

以下是我对此的看法。我知道不推荐使用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

答案 2 :(得分:0)

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 :(得分:0)

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()

答案 4 :(得分:0)

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

节奏为每个州提供前3名县

if index == nil || index == 7 { ...

输出

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()