获取pandas数据帧中的组大小

时间:2018-05-29 22:56:17

标签: python pandas dataframe 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

founding_year起初有点令人困惑,但数据集正在做的是跟踪每年are countries in 2001收集各种统计数据的国家/地区。

不,我想创建一个图表来显示各国的创建/建立。我已经为X轴提供了year变量,而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()命令给出相同的结果。 我尝试在groupby函数的末尾添加year,但这使得它只返回一大堆唯一值。

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

1 个答案:

答案 0 :(得分:4)

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

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