Python 按3列和条件搜索数据帧

Python 按3列和条件搜索数据帧,python,sorting,pandas,dataframe,Python,Sorting,Pandas,Dataframe,我有一个来自美国的人口普查数据框架。栏目包括STNAME(州名)CTYNAME(县名)以及按年份收集的人口普查报告中不同数据段的许多栏目 我在寻找人口最多的前三个州,仅包括每个州人口最多的前三个县 下面是我当前的代码,它稍微理顺了原始数据帧,只包括与问题相关的内容: def answer(): census_df50 = census_df[census_df['SUMLEV'] == 50] columns = ['STNAME', 'CTYNAME', 'CENSUS2010

我有一个来自美国的人口普查数据框架。栏目包括
STNAME
(州名)
CTYNAME
(县名)以及按年份收集的人口普查报告中不同数据段的许多栏目

我在寻找人口最多的前三个州,仅包括每个州人口最多的前三个县

下面是我当前的代码,它稍微理顺了原始数据帧,只包括与问题相关的内容:

def answer():
    census_df50 = census_df[census_df['SUMLEV'] == 50]
    columns = ['STNAME', 'CTYNAME', 'CENSUS2010POP']
    c = census_df50[columns]
    return c
print(answer())
以下是终端中打印的数据帧示例:

     STNAME             CTYNAME  CENSUS2010POP
1       Alabama      Autauga County          54571
2       Alabama      Baldwin County         182265
3       Alabama      Barbour County          27457
4       Alabama         Bibb County          22915
5       Alabama       Blount County          57322
6       Alabama      Bullock County          10914
7       Alabama       Butler County          20947
8       Alabama      Calhoun County         118572
它是按州然后按县的字母顺序列出的,因此这只按县名显示阿拉巴马州的人口普查数据,但数据框中有3000多行(每个县一行,州有多个条目)

我的方法是编写一个函数,根据
CTYNAME
列中每个州的
CENSUS2016POP
值(一个代表2010年人口的整数),查找
CTYNAME
中的前3个县。然后让函数按此条件将名称作为前3个状态的字符串返回。然而,对于如何实现这一点,我相当迷茫

我很确定我应该尝试使用这些函数的组合
.groupby()
.set\u index()
.nlargest()


任何帮助都将不胜感激

由于您没有提供任何样本数据,以下是一些:

STNAME,CTYNAME,POPULATION
A,A1,100
A,A2,20
A,A3,30
A,A4,40
B,B1,10
B,B2,2
B,B3,30
B,B4,40
C,C1,100
C,C2,20
C,C3,300
C,C4,40
D,D1,10
D,D2,20
D,D3,30
D,D4,40

In [1]: df = pd.read_clipboard(sep=',')
这里有一个达到预期效果的方法,可能更简单,但我无法进一步减少:

In [2]: df.ix[df['STNAME'].isin(df.groupby('STNAME')['POPULATION'].sum().nlargest(3).index)].groupby(['STNAME','CTYNAME']).sum()['POPULATION'].groupby(level=0, group_keys=False).nlargest(3)

分解:

# Find the first STNAME Groups
In [3]: largest_states = df.groupby('STNAME')['POPULATION'].sum().nlargest(3).index
        largest_states

Out[3]: Index(['C', 'A', 'D'], dtype='object', name='STNAME')
在以下各项上过滤df:

In [4]: df2 = df.ix[df['STNAME'].isin(df.groupby('STNAME')['POPULATION'].sum().nlargest(3).index)]
然后在以下内容中找到前三个:

In [5]: df2.groupby(['STNAME','CTYNAME']).sum()['POPULATION'].groupby(level=0, group_keys=False).nlargest(3)

Out[5]:
STNAME  CTYNAME
A       A1         100
        A4          40
        A3          30
C       C3         300
        C1         100
        C4          40
D       D4          40
        D3          30
        D2          20
Name: POPULATION, dtype: int64

更新:

如果要按州人口对其进行排序,请按以下顺序进行:

In[6]: df2 = df.groupby(['STNAME','CTYNAME']).sum()['POPULATION'].groupby(level=0, group_keys=False).nlargest(3)

       df2.ix[df.groupby('STNAME')['POPULATION'].sum().nlargest(3).index]

Out[6]:
STNAME  CTYNAME
C       C3         300
        C1         100
        C4          40
A       A1         100
        A4          40
        A3          30
D       D4          40
        D3          30
        D2          20
Name: POPULATION, dtype: int64

如果你能在将来发布你的数据样本,那就太好了。谢谢你的回复!现在看看。也谢谢你的建议。我刚刚编辑了我的问题,添加了一些原始代码和数据帧输出的示例。