首页 > 解决方案 > 操作数据帧

问题描述

我有一个看起来像这样的数据框;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

标签: pythonpandas

解决方案


您可以使用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

推荐阅读