如何在没有多级索引的情况下创建分组数据帧

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

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

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)