How to create a groupby dataframe without a multi-level index(如何在没有多级索引的情况下创建分组数据帧)
本文介绍了如何在没有多级索引的情况下创建分组数据帧的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下 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.renamebin列,然后使用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')
这篇关于如何在没有多级索引的情况下创建分组数据帧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:如何在没有多级索引的情况下创建分组数据帧
基础教程推荐
猜你喜欢
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
