在 Pandas 数据框中获取组大小

Jas*_*per 3 python dataframe pandas pandas-groupby

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

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
Run Code Online (Sandbox Code Playgroud)

founding_year是位在第一混乱,但什么数据集是干什么的,是其跟踪的国家are countries in 2001,每年-收集有关他们的各种统计数据。

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

我使用以下命令:

df.groupby(['founding_years', 'country']).size()
Run Code Online (Sandbox Code Playgroud)

我选择了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
Run Code Online (Sandbox Code Playgroud)

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

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

jpp*_*jpp 5

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

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
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要向原始数据帧添加计数系列,请使用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
Run Code Online (Sandbox Code Playgroud)