python - Pandas 数据框按 3 列和条件搜索

标签 python sorting pandas dataframe

我有一个来自美国的人口普查数据的 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/

相关文章:

sql - 在SQL Server中将字符串排序为数字

python - 手动安装开放多语言世界网 (NLTK)

python - 将 NBA 比赛具体 .json 转换为 .csv

javascript - 如何在 JQuery UI 中禁用排序?

c++ - std::set 和 std::priority_queue 之间的区别

python - Pandas 数据帧上的追踪止损

python - 从 Pandas 数据框列或行中获取列表?

python - 从json中提取字段

python - 将数组列表转换为列表列表?

python - 2 个远程主机之间的 scp - 无密码