如何按 headers 列和 运行 汇总统计数据对 pandas 数据帧进行分组? [python]
How to group pandas dataframe by column headers and run summary statitics? [python]
我正在尝试根据数据框制作汇总统计数据 table,但我很难思考如何正确分组列。
我有以下数据框:
Year Value_1 Value 2
------------------------------------
0 2012 43 34
1 2012 45 24
2 2012 35 44
3 2012 32 44
4 2012 35 31
5 2012 65 51
...
76 2015 34 22
77 2015 74 34
78 2015 63 76
79 2015 54 45
80 2015 25 76
...
我想创建一个 table 来显示每个 Value
和每个年份的平均值、中位数、最小值和最大值。所以我希望输出 table 首先按 Value
分组,然后按 Year
分组,显示每个 Value
类别的平均值、中位数、最小值和最大值每年。
我试过简单地做:
df.groupby('Year').describe()
和我想要的按年份分组,但它没有按 Value
类别分组,因此重复平均值、中值、最小值和最大值列两次。我不想重复“平均值”、“中值”、“最小值”和“最大值”列。如何在 python 中解决这个问题?我无法概念化应该如何组织这个分组。
我希望生成此输出数据帧:
Value Year Mean Median Min Max
---------------------------------------------------
Value_1 2012 XX XX XX XX
2013 XX XX XX XX
2014 XX XX XX XX
2015 XX XX XX XX
Value_2 2012 XX XX XX XX
2013 XX XX XX XX
2014 XX XX XX XX
2015 XX XX XX XX
IIUC 你希望它看起来像这样:
编辑:
再进行一次(更短的)尝试:
(1)
df = pd.DataFrame(
{'Year': [2012, 2012, 2012, 2012, 2013, 2013, 2015, 2015, 2015, 2016, 2016],
'Value_1': [43, 45, 35, 32, 35, 65, 34, 74, 63, 54, 25],
'Value_2': [34, 24, 44, 44, 31, 51, 22, 34, 76, 45, 76]})
res = (df
.melt('Year')
.groupby(['variable', 'Year'])
.describe()
.droplevel(0,axis=1))
print(res)
count mean std min 25% 50% 75% max
variable Year
Value_1 2012 4.0 38.75 6.238322 32.0 34.25 39.0 43.50 45.0
2013 2.0 50.00 21.213203 35.0 42.50 50.0 57.50 65.0
2015 3.0 57.00 20.663978 34.0 48.50 63.0 68.50 74.0
2016 2.0 39.50 20.506097 25.0 32.25 39.5 46.75 54.0
Value_2 2012 4.0 36.50 9.574271 24.0 31.50 39.0 44.00 44.0
2013 2.0 41.00 14.142136 31.0 36.00 41.0 46.00 51.0
2015 3.0 44.00 28.354894 22.0 28.00 34.0 55.00 76.0
2016 2.0 60.50 21.920310 45.0 52.75 60.5 68.25 76.0
(2)
df = pd.DataFrame(
{'Year': [2012, 2012, 2012, 2012, 2013, 2013, 2015, 2015, 2015, 2016, 2016],
'Value_1': [43, 45, 35, 32, 35, 65, 34, 74, 63, 54, 25],
'Value_2': [34, 24, 44, 44, 31, 51, 22, 34, 76, 45, 76]})
res = (df
.groupby('Year')
.describe()
.unstack()
.unstack(level=1)
.reset_index()
.rename(columns={'level_0' : 'value'})
.set_index(['value', 'Year']))
print(res)
count mean std min 25% 50% 75% max
value Year
Value_1 2012 4.0 38.75 6.238322 32.0 34.25 39.0 43.50 45.0
2013 2.0 50.00 21.213203 35.0 42.50 50.0 57.50 65.0
2015 3.0 57.00 20.663978 34.0 48.50 63.0 68.50 74.0
2016 2.0 39.50 20.506097 25.0 32.25 39.5 46.75 54.0
Value_2 2012 4.0 36.50 9.574271 24.0 31.50 39.0 44.00 44.0
2013 2.0 41.00 14.142136 31.0 36.00 41.0 46.00 51.0
2015 3.0 44.00 28.354894 22.0 28.00 34.0 55.00 76.0
2016 2.0 60.50 21.920310 45.0 52.75 60.5 68.25 76.0
我正在尝试根据数据框制作汇总统计数据 table,但我很难思考如何正确分组列。
我有以下数据框:
Year Value_1 Value 2
------------------------------------
0 2012 43 34
1 2012 45 24
2 2012 35 44
3 2012 32 44
4 2012 35 31
5 2012 65 51
...
76 2015 34 22
77 2015 74 34
78 2015 63 76
79 2015 54 45
80 2015 25 76
...
我想创建一个 table 来显示每个 Value
和每个年份的平均值、中位数、最小值和最大值。所以我希望输出 table 首先按 Value
分组,然后按 Year
分组,显示每个 Value
类别的平均值、中位数、最小值和最大值每年。
我试过简单地做:
df.groupby('Year').describe()
和我想要的按年份分组,但它没有按 Value
类别分组,因此重复平均值、中值、最小值和最大值列两次。我不想重复“平均值”、“中值”、“最小值”和“最大值”列。如何在 python 中解决这个问题?我无法概念化应该如何组织这个分组。
我希望生成此输出数据帧:
Value Year Mean Median Min Max
---------------------------------------------------
Value_1 2012 XX XX XX XX
2013 XX XX XX XX
2014 XX XX XX XX
2015 XX XX XX XX
Value_2 2012 XX XX XX XX
2013 XX XX XX XX
2014 XX XX XX XX
2015 XX XX XX XX
IIUC 你希望它看起来像这样:
编辑: 再进行一次(更短的)尝试:
(1)
df = pd.DataFrame(
{'Year': [2012, 2012, 2012, 2012, 2013, 2013, 2015, 2015, 2015, 2016, 2016],
'Value_1': [43, 45, 35, 32, 35, 65, 34, 74, 63, 54, 25],
'Value_2': [34, 24, 44, 44, 31, 51, 22, 34, 76, 45, 76]})
res = (df
.melt('Year')
.groupby(['variable', 'Year'])
.describe()
.droplevel(0,axis=1))
print(res)
count mean std min 25% 50% 75% max
variable Year
Value_1 2012 4.0 38.75 6.238322 32.0 34.25 39.0 43.50 45.0
2013 2.0 50.00 21.213203 35.0 42.50 50.0 57.50 65.0
2015 3.0 57.00 20.663978 34.0 48.50 63.0 68.50 74.0
2016 2.0 39.50 20.506097 25.0 32.25 39.5 46.75 54.0
Value_2 2012 4.0 36.50 9.574271 24.0 31.50 39.0 44.00 44.0
2013 2.0 41.00 14.142136 31.0 36.00 41.0 46.00 51.0
2015 3.0 44.00 28.354894 22.0 28.00 34.0 55.00 76.0
2016 2.0 60.50 21.920310 45.0 52.75 60.5 68.25 76.0
(2)
df = pd.DataFrame(
{'Year': [2012, 2012, 2012, 2012, 2013, 2013, 2015, 2015, 2015, 2016, 2016],
'Value_1': [43, 45, 35, 32, 35, 65, 34, 74, 63, 54, 25],
'Value_2': [34, 24, 44, 44, 31, 51, 22, 34, 76, 45, 76]})
res = (df
.groupby('Year')
.describe()
.unstack()
.unstack(level=1)
.reset_index()
.rename(columns={'level_0' : 'value'})
.set_index(['value', 'Year']))
print(res)
count mean std min 25% 50% 75% max
value Year
Value_1 2012 4.0 38.75 6.238322 32.0 34.25 39.0 43.50 45.0
2013 2.0 50.00 21.213203 35.0 42.50 50.0 57.50 65.0
2015 3.0 57.00 20.663978 34.0 48.50 63.0 68.50 74.0
2016 2.0 39.50 20.506097 25.0 32.25 39.5 46.75 54.0
Value_2 2012 4.0 36.50 9.574271 24.0 31.50 39.0 44.00 44.0
2013 2.0 41.00 14.142136 31.0 36.00 41.0 46.00 51.0
2015 3.0 44.00 28.354894 22.0 28.00 34.0 55.00 76.0
2016 2.0 60.50 21.920310 45.0 52.75 60.5 68.25 76.0