在pandas数据框中获取分组大小

3

我有一个按年份列出的国家列表,如下:

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
< p > founding_year 刚开始有点难理解,但数据集所做的是追踪每年作为国家的国家,并收集它们的各种统计信息。

现在我想创建一个图表以显示国家的建立/成立时间。我已经有了 X 轴的 year 变量和需要的信息由 founding_year 提供 - 但我在使用 groupby 操作以获取 每个成立年份的新国家数量 时遇到困难。

我使用以下命令:

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() 命令可以得到相同的结果。 我尝试在 groupby 函数末尾添加 year,但这只会返回一堆唯一值。

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

1个回答

7

关于每个创建年份的国家数量,您应该仅按年份进行分组。例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接