拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 从Pandas中按月分组的资料创建多索引

从Pandas中按月分组的资料创建多索引

白鹭 - 2022-02-02 1974 0 0

考虑以下示例资料:

Month  Location  Products    Sales  Profit
JAN      1        43          32     20  
JAN      2        82          54     25
JAN      3        64          43     56
FEB      1        37          28     78
FEB      2        18          15     34
FEB      3        5           2      4
MAR      1        47          40     14

我试图实作的多索引转换是这样的:

          JAN                     FEB                     MAR
Location  Products Sales Profit   Products Sales Profit   Products Sales Profit
1         43       32    29       37       28    78       47       40    14
2         82       54    25       18       15    34       null     null  null
3         64       43    56       5        2     4        null     null  null

我试过这个版本:

df.stack().to_frame().T

它将所有资料放在一行中。所以,这不是目标。
我想我很接近,因为它应该是堆栈或拆开,融化或不融化,但我的尝试在这一点上都导致了资料燕麦片。感谢您尝试解决这个问题的时间。

uj5u.com热心网友回复:

使用pivot

>>> df.pivot('Location', 'Month').swaplevel(axis=1).sort_index(axis=1)

Month         FEB                   JAN                   MAR             
         Products Profit Sales Products Profit Sales Products Profit Sales
Location                                                                  
1            37.0   78.0  28.0     43.0   20.0  32.0     47.0   14.0  40.0
2            18.0   34.0  15.0     82.0   25.0  54.0      NaN    NaN   NaN
3             5.0    4.0   2.0     64.0   56.0  43.0      NaN    NaN   NaN

要保留 order,您必须MonthCategoricalDtype以前一样转换

df['Month'] = df['Month'].astype(pd.CategoricalDtype(df['Month'].unique(), ordered=True))
out = df.pivot('Location', 'Month').swaplevel(axis=1).sort_index(axis=1)
print(out)

# Output:
Month         JAN                   FEB                   MAR             
         Products Profit Sales Products Profit Sales Products Profit Sales
Location                                                                  
1            43.0   20.0  32.0     37.0   78.0  28.0     47.0   14.0  40.0
2            82.0   25.0  54.0     18.0   34.0  15.0      NaN    NaN   NaN
3            64.0   56.0  43.0      5.0    4.0   2.0      NaN    NaN   NaN

更新 2

尝试强制级别 2 列的顺序:

df1 = df.set_index(['Month', 'Location'])
df1.columns = pd.CategoricalIndex(df1.columns, ordered=True)
df1 = df1.unstack('Month').swaplevel(axis=1).sort_index(axis=1)

uj5u.com热心网友回复:

您可以pivotreorder_levels和一起 使用sort_index()

df.pivot(index='Location',columns='Month').reorder_levels(order=[1,0],axis=1).sort_index(axis=1)

Month         FEB                   JAN                   MAR             
         Products Profit Sales Products Profit Sales Products Profit Sales
Location                                                                  
1            37.0   78.0  28.0     43.0   20.0  32.0     47.0   14.0  40.0
2            18.0   34.0  15.0     82.0   25.0  54.0      NaN    NaN   NaN
3             5.0    4.0   2.0     64.0   56.0  43.0      NaN    NaN   NaN

如果您有兴趣,这个答案在swaplevel之间进行了详细说明reoder_levels

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *