如何在没有多级索引的情况下创建分组数据帧 [英] How to create a groupby dataframe without a multi-level index

查看:24
本文介绍了如何在没有多级索引的情况下创建分组数据帧的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下 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包装。
a = pd.DataFrame(df.groupby('season')['bin'].value_counts()/df.groupby('season')['bin'].count()).rename(columns={'bin': 'normalized_bin'}).reset_index()

其他资源

打印

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')

这篇关于如何在没有多级索引的情况下创建分组数据帧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆