本文介绍了如何在没有多级索引的情况下创建分组数据帧的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下 pandas groupby
对象,我想将结果转换为新的数据帧。
以下是获取条件概率的代码:
bin_probs = data.groupby('season')['bin'].value_counts()/data.groupby('season')['bin'].count()
我尝试了以下代码,但返回如下。
- 我喜欢用
season
来填写每一行。我该如何做?
a = pd.DataFrame(data_5.groupby('season')['bin'].value_counts()/data_5.groupby('season')['bin'].count())
推荐答案
a
是一个DataFrame,但是有一个二级索引,所以我的解释是你想要一个没有多级索引的DataFrame。- 当索引和列中的名称相同时,无法重置索引。
- 使用
pandas.Series.reset_index
,并设置name='normalized_bin
,以重命名bin
列。- 这不适用于OP中的实现,因为这是一个数据帧。
- 这适用于以下实现,因为
pandas.Series
是用.groupby
创建的。
- 规范化该列的正确方法是在
.value_counts
中使用normalize=True
参数。
import pandas as pd
import random # for test data
import numpy as np # for test data
# setup a dataframe with test data
np.random.seed(365)
random.seed(365)
rows = 1100
data = {'bin': np.random.randint(10, size=(rows)),
'season': [random.choice(['fall', 'winter', 'summer', 'spring']) for _ in range(rows)]}
df = pd.DataFrame(data)
# display(df.head())
bin season
0 2 summer
1 4 winter
2 1 summer
3 5 winter
4 2 spring
# groupby, normalize and reset the the Series index
a = df.groupby(['season'])['bin'].value_counts(normalize=True).reset_index(name='normalized_bin')
# display(a.head(15))
season bin normalized_bin
0 fall 2 0.15600
1 fall 9 0.11600
2 fall 3 0.10800
3 fall 4 0.10400
4 fall 6 0.10000
5 fall 0 0.09600
6 fall 8 0.09600
7 fall 5 0.08400
8 fall 7 0.08000
9 fall 1 0.06000
10 spring 0 0.11524
11 spring 8 0.11524
12 spring 9 0.11524
13 spring 3 0.11152
14 spring 1 0.10037
使用a
的操作码
- 如上所述,使用
normalize=True
获取规格化值 - OP中的解决方案创建一个DataFrame,因为
.groupby
用DataFrame构造函数pandas.DataFrame
包装。- 若要重置索引,必须首先
pandas.DataFrame.rename
bin
列,然后使用pandas.DataFrame.reset_index
- 若要重置索引,必须首先
a = pd.DataFrame(df.groupby('season')['bin'].value_counts()/df.groupby('season')['bin'].count()).rename(columns={'bin': 'normalized_bin'}).reset_index()
其他资源
- 请参阅Pandas unable to reset index because name exist以按
level
重置。
打印
- 先用
pandas.Series.unstack()
再用pandas.DataFrame.plot.bar
从多指标系列作图更容易 - 对于并行栏,请设置
stacked=False
。 - 条形图都等于1,因为这是标准化数据。
s = df.groupby(['season'])['bin'].value_counts(normalize=True).unstack()
# plot a stacked bar
s.plot.bar(stacked=True, figsize=(8, 6))
plt.legend(title='bin', bbox_to_anchor=(1.05, 1), loc='upper left')
这篇关于如何在没有多级索引的情况下创建分组数据帧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!