为 pandas 中的组添加缺失的行

har*_*dar 3 python dataframe pandas

我有一个带有country,yearvalue列的数据。最大值(年份)是 1985 年,最小值(年份)是 2016 年,但并非所有国家都有全年(1985-2016)的数据。因此,为了绘制国家/地区之间的可比条形图,我想value为每个国家/地区的缺失年份添加 0。

例如:

df -->
    country year    value
0   India   2040    354
1   India   2041    357
2   India   2042    454
3   USA     2040    454
4   USA     2041    436
Run Code Online (Sandbox Code Playgroud)

由于美国没有 2042 数据,因此将其添加到:

    country year    value
0   India   2040    354
1   India   2041    357
2   India   2042    454
3   USA     2040    454
4   USA     2041    436
5   USA     2042    0 
Run Code Online (Sandbox Code Playgroud)

如何针对我的数据中的每个国家/地区执行此操作?

cs9*_*s95 7

我们可以将“年份”转换为分类列,然后让 pandas GroupBy 来完成繁重的工作:

df['year'] = pd.Categorical(df['year'], categories=df['year'].unique())
df.groupby(['country','year'], as_index=False).first()

  country  year  value
0   India  2040  354.0
1   India  2041  357.0
2   India  2042  454.0
3     USA  2040  454.0
4     USA  2041  436.0
5     USA  2042    NaN
Run Code Online (Sandbox Code Playgroud)

另一个想法是重新索引:

mux = pd.MultiIndex.from_product([df['country'].unique(), df['year'].unique()])

(df.set_index(['country', 'year'])
   .reindex(mux)
   .reset_index()
   .set_axis(df.columns, axis=1))

  country  year  value
0   India  2040  354.0
1   India  2041  357.0
2   India  2042  454.0
3     USA  2040  454.0
4     USA  2041  436.0
5     USA  2042    NaN
Run Code Online (Sandbox Code Playgroud)

重要警告:这些解决方案都不能很好地处理重复行。您将需要通过添加唯一标识列(可能使用GroupBy.cumcount.


WeN*_*Ben 6

pivot那么我们就来尝试一下stack

out = df.pivot(*df).stack(dropna=False).reset_index(name='value')
  country  year  value
0   India  2040  354.0
1   India  2041  357.0
2   India  2042  454.0
3     USA  2040  454.0
4     USA  2041  436.0
5     USA  2042    NaN
Run Code Online (Sandbox Code Playgroud)