我有一个来自美国的人口普查数据的 pandas dataframe
。列包括 STNAME
(州名称)CTYNAME
(县名称)以及人口普查报告中按年份收集的不同数据的许多列。
我正在寻找人口最多的 3 个州,仅包括每个州人口最多的 3 个县。
这是我当前的代码,它稍微整理了原始数据帧,并且仅包含与问题相关的内容:
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 行(每个县一个,州有多个条目)
我的方法是编写一个函数,根据每个州的 CENSUS2016POP
值(代表 2010 年人口的整数)查找 CTYNAME
中排名前 3 的县在 STNAME
列中。然后让函数按照此条件将名称作为前 3 个州的字符串返回。然而,我不知道如何实现这一点。
我很确定我应该尝试使用这些函数 .groupby()
、.set_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
关于python - Pandas 数据框按 3 列和条件搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40731426/