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