python - 操作数据帧
问题描述
我有一个看起来像这样的数据框;Category1-Category6 是索引的名称,Jan-2021 和 Feb-2021 是列:
Jan-2021 Feb-2021
Category1 34565345 58930202
Category2 45213056 37328292
Category3 99658453 42243222
Category4 23455436 35738292
Category5 84384954 34839202
Category6 67932022 34587293
我希望它看起来像这样,即将每列加倍,并将生成的两列保持在同一个标题下。然后将一个重复列滞后于另一列。有人可以帮忙吗?
Jan-2021 Feb-2021
Category1 34565345 58930202
Category2 45213056 34565345 37328292 58930202
Category3 99658453 45213056 42243222 37328292
Category4 23455436 99658453 35738292 42243222
Category5 84384954 23455436 34839202 35738292
Category6 67932022 84384954 34587293 34839202
67932022 34587293
解决方案
您可以使用DataFrame.shift
,但为避免删除最后一行添加了空 DataFrame,然后加入 byconcat
并避免重复的列名称使用keys
参数,最后用于预期的顺序MultiIndex.from_product
,如有必要DataFrame.reindex
,将输出转换为:integers with NaNs
cols = df.columns
df1 = df.append(pd.DataFrame(index=['new'], columns=cols)).shift()
df = pd.concat([df, df1], axis=1, keys=('orig','lag'))
new = pd.MultiIndex.from_product([cols, ('orig','lag')]).swaplevel(1,0)
df = df.reindex(new, axis=1).astype('Int64')
print (df)
orig lag orig lag
Jan-2021 Jan-2021 Feb-2021 Feb-2021
Category1 34565345 <NA> 58930202 <NA>
Category2 45213056 34565345 37328292 58930202
Category3 99658453 45213056 42243222 37328292
Category4 23455436 99658453 35738292 42243222
Category5 84384954 23455436 34839202 35738292
Category6 67932022 84384954 34587293 34839202
new <NA> 67932022 <NA> 34587293
对于 select inMultiIndex
是一个选项使用DataFrame.xs
:
print (df.xs('Jan-2021', axis=1, level=1))
orig lag
Category1 34565345 <NA>
Category2 45213056 34565345
Category3 99658453 45213056
Category4 23455436 99658453
Category5 84384954 23455436
Category6 67932022 84384954
new <NA> 67932022
如果MultiIndex
需要交换级别的顺序:
cols = df.columns
df1 = df.append(pd.DataFrame(index=['new'], columns=cols)).shift()
df = pd.concat([df, df1], axis=1, keys=('orig','lag')).swaplevel(1,0, axis=1)
new = pd.MultiIndex.from_product([cols, ('orig','lag')])
df = df.reindex(new, axis=1).astype('Int64')
print (df)
Jan-2021 Feb-2021
orig lag orig lag
Category1 34565345 <NA> 58930202 <NA>
Category2 45213056 34565345 37328292 58930202
Category3 99658453 45213056 42243222 37328292
Category4 23455436 99658453 35738292 42243222
Category5 84384954 23455436 34839202 35738292
Category6 67932022 84384954 34587293 34839202
new <NA> 67932022 <NA> 34587293
print (df.xs('Jan-2021', axis=1))
orig lag
Category1 34565345 <NA>
Category2 45213056 34565345
Category3 99658453 45213056
Category4 23455436 99658453
Category5 84384954 23455436
Category6 67932022 84384954
new <NA> 67932022
推荐阅读
- python - 将测地线数据类型更改为整数
- sequelize.js - 如何使用 findone 从 Sequelize 模型中获取所需的列数据
- python - 同时使用 scedule 和 Telebot
- reactjs - React 中的 Pdf 有时不显示
- nginx - *Nginx* ERR_TOO_MANY_REDIRECTS 重定向循环
- typescript - 如何将接口键入为 Dispatch
? - c - 如何在 Linux 上使用多个加密狗?
- database - MongoDB 4.4:$filter 的输入必须是一个不长的数组
- python - 从数据库导入数据时缺少列名(python + postgre sql)
- android-studio - 灰色资源 - xmlns:tools="http://schemas.android.com/tools" 和 xmlns:card_view="http://schemas.android.com/apk/res-auto"