har*_*dar 3 python dataframe pandas
我有一个带有country,year和value列的数据。最大值(年份)是 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)
如何针对我的数据中的每个国家/地区执行此操作?
我们可以将“年份”转换为分类列,然后让 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.
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)
| 归档时间: |
|
| 查看次数: |
2022 次 |
| 最近记录: |