当我用一个变量透视一个面板数据集并将月份放在Yaxis上,将年份放在Xaxis上时,Python执行什么操作?

2024-05-03 06:29:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为panel_df面板数据集,包含以下列:idyearmonth和一个变量x

然后我通过下面一行:

panel_df.pivot_table(values=x, index='month', columns='year')

我获得的输出是一个y轴上有month,x轴上有year的表,因此每个单元格是由year-month对唯一标识的图形

我的疑问是:Python在执行上述代码行时做了什么?是否取横截面的平均值,即对于每个year-month对,取所有idx的平均值

提前感谢大家抽出时间


Tags: columns数据id图形面板dfindextable
1条回答
网友
1楼 · 发布于 2024-05-03 06:29:06

对于python版本0.23.4,默认情况下,相应的参数aggfunc设置为“平均值”:
https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.pivot_table.html
因此,对于每个年-月对,pivot在所有相应的观测值中取x的平均值

>>> import pandas as pd
>>> panel_df = \
pd.DataFrame(
    {
        'id':[0]*8 + [1]*8,
        'year':[2010]*4 + [2011]*4 + [2010]*4 + [2011]*4,
        'month':[1,1,7,7]*4,
        'x':[i for i in range(16)],
    }
)
>>> panel_df

    id  year  month   x
0    0  2010      1   0
1    0  2010      1   1
2    0  2010      7   2
3    0  2010      7   3
4    0  2011      1   4
5    0  2011      1   5
6    0  2011      7   6
7    0  2011      7   7
8    1  2010      1   8
9    1  2010      1   9
10   1  2010      7  10
11   1  2010      7  11
12   1  2011      1  12
13   1  2011      1  13
14   1  2011      7  14
15   1  2011      7  15

然后:

>>> panel_df.pivot_table(
    values = 'x',
    index = 'month',
    columns = 'year'
)
year   2010  2011
month            
1       4.5   8.5
7       6.5  10.5

相当于:

>>> panel_df.pivot_table(
    values = 'x',
    index = 'month',
    columns = 'year',
    aggfunc='mean',
    fill_value=None,
    margins=False
)
year   2010  2011
month            
1       4.5   8.5
7       6.5  10.5

您可以将参数aggfunc的默认值更改为“sum”,例如:

>>> panel_df.pivot_table(
    values = 'x',
    index = 'month',
    columns = 'year',
    aggfunc='sum',
    fill_value=None,
    margins=False
)
year   2010  2011
month            
1        18    34
7        26    42

您可能还会发现使用边距值并将其设置为True很有用:

>>> panel_df.pivot_table(
    values = 'x',
    index = 'month',
    columns = 'year',
    aggfunc='sum',
    fill_value=None,
    margins=True
)

year   2010  2011  All
month                 
1        18    34   52
7        26    42   68
All      44    76  120

相关问题 更多 >