首页 > 解决方案 > 获取熊猫数据框中的组大小

问题描述

我有一个按年份列出的国家/地区列表,就像这样

country  year  founding_year  other_vars
 Fake    1900    1950             data
 Fake    1901    1950             data
 Fake    1902    1950             data
             (...)
 USE     1900    1901             data
 USE     1901    1901             data
 USE     1901    1901             data

起初有点令人founding_year困惑,但数据集的作用是它are countries in 2001每年跟踪国家 - 收集关于它们的各种统计数据。

不,我想创建一个图表来显示随着时间的推移国家的创建/建立。我已经有了yearX 轴的变量,并且该founding_year变量提供了我需要的信息 - 但我在groupby获取number of new nations per founding year

我使用以下命令:

df.groupby(['founding_years', 'country']).size()

我选择了founding_yearcountry变量以确保我有唯一的对(因为每个国家有多行)

但是,这给了我一个错误的结果。

founding_year  country                 
1945     Austria                     46
         Poland                      46
1946     Jordan                      46
         Lebanon                     46
         Philippines                 46
         Syria                       16
1947     India                       46
         Pakistan                    25
1948     Israel                      46
         Myanmar                     46
         North Korea                 46
         South Korea                 46
         Sri Lanka                   46

相反,它返回该国家在数据库中的行数。.count()命令给出相同的结果。我尝试year在 groupby 函数的末尾添加,但这使它只返回一大堆唯一值。

我有点困惑,我需要的所有信息都在那里,但我似乎无法弄清楚如何获得它 - 你们中有人知道我错过了什么吗?

标签: pythonpandasdataframepandas-groupby

解决方案


对于每个创始年份的国家数量,您应该只按年份分组。例如:

df = pd.DataFrame([['c1', 1950], ['c1', 1950], ['c1', 1950],
                   ['c2', 1960], ['c2', 1960], ['c2', 1960],
                   ['c3', 1970], ['c3', 1970], ['c3', 1970],
                   ['c4', 1960], ['c4', 1960], ['c4', 1960],
                   ['c5', 1950], ['c5', 1950], ['c5', 1950]],
                  columns=['country', 'year'])

res = df.groupby('year')['country'].nunique().reset_index()

print(res)

   year  country
0  1950        2
1  1960        2
2  1970        1

或者,如果您需要向原始数据框添加计数系列,请使用pd.DataFrame.transform

df['count'] = df.groupby('year')['country'].transform('nunique')

print(df)

   country  year  count
0       c1  1950      2
1       c1  1950      2
2       c1  1950      2
...
6       c3  1970      1
7       c3  1970      1
8       c3  1970      1
9       c4  1960      2
...
13      c5  1950      2
14      c5  1950      2

推荐阅读