如何在Pandas中对一个多索引进行分组

如何在Pandas中对一个多索引进行分组

在这篇文章中,我们将展示如何在Pandas的多索引数据框架上使用groupby。在数据科学中,当我们进行探索性数据分析时,我们经常使用groupby来将一列的数据基于另一列进行分组。因此,我们能够分析一个列的数据是如何分组的,或者是如何基于另一个列的。还有一个替代groupby的方法,我们也可以使用Pivot Table。

groupby操作涉及分割对象、应用函数和合并结果的一些组合。这可以用来对大量的数据进行分组,并对这些组进行计算操作。任何groupby操作都涉及对原始DataFrame的以下操作之一。它们如下。

1.分割物体。
2.合并输出。
3.应用一个函数。

语法:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, 
                 group_keys=True, squeeze=False, **kwargs)

参数 :

  • by:映射、函数、标签或表格列表
  • axis : { 0 or ‘index’, 1 or ‘columns’}, default 0
  • level: 级别名称
  • sort : bool, default True

返回类型 :数据框GroupBy

我们必须把索引的名字,在列表中传递给groupby函数的level参数。区域 “索引是级别(0)索引,”州 “索引是级别(1)索引。在这篇文章中,我们将使用这个CSV文件。

我们来看看CSV文件

# importing pandas library
# as alias pd
import pandas as pd
 
# storing the data in the df dataframe
# using pandas 'read_csv()'.
df = pd.read_csv('homelessness.csv')
 
print(df.head())

输出:

如何在Pandas中对一个多索引进行分组?

数据框架中的列:我们可以通过使用Pandas的columns属性来了解数据框架的列。

# using pandas columns attribute.
col = df.columns
 
print(col)

输出 :

如何在Pandas中对一个多索引进行分组?

由于DataFrame中没有索引,我们可以说这个DataFrame没有索引。首先,我们必须使这个DataFrame成为多索引DataFrame,或者分层索引DataFrame。

多索引:拥有一个以上索引的DataFrame被称为多索引DataFrame。要了解更多关于多索引的DataFrame,如何使DataFrame具有多索引,以及如何使用多索引的DataFrame进行数据探索,你可以参考这篇文章。

为了使DataFrame具有多索引,我们将使用Pandas的set_index()函数。我们将使数据框架的 “区域 “和 “状态 “列成为索引。

示例

# using the pandas set_index().
# passing the name of the columns in the list.
 
df = df.set_index(['region' , 'state'])
 
# sort the data using sort_index()
df.sort_index()
 
print(df.head())

输出 :

如何在Pandas中对一个多索引进行分组?

现在,DataFrame是一个多索引的DataFrame,有 “区域 “和 “状态 “列作为索引。

在多指标数据框架上使用Groupby操作

在这里,我们将用从0开始的编号索引来表示各层次。

# passing the level of indexes in
# the list to the level argument.
df.groupby(level=[0,1]).sum()

输出:

如何在Pandas中对一个多索引进行分组?

我们也可以传递列的名称,而不是级别编号。

# passing name of the index in
# the level argument.
y = df.groupby(level=['region'])['individuals'].mean()
 
print(y)

输出:

如何在Pandas中对一个多索引进行分组?

我们还可以用groupby的一些方法来探索更多。

1. apply() in groupby:

假设我们想知道每个地区有多少个州的’family_members’超过了1000。对于这种问题的陈述,我们可以使用apply()。在apply()中,我们必须传入专门为某一特定任务设计的函数类型。因此,在这种情况下,我们将使用lambda函数,这是一种在一行中编写函数的好方法。

示例:

# import numpy library as alias np
import numpy as np
 
# applying .apply(), inside which passing
# the lambda function. lambda function,
# counting the no of states in each region
# where are more than 1000 family_members.
fam_1000 = df.groupby(
  level=["region"])["family_members"].apply(lambda x : np.sum(x>1000))
 
print(fam_1000)

输出:

如何在Pandas中对一个多索引进行分组?

2. agg() in groupby

agg()函数可用于执行一些统计操作,如min(), max(), mean()等。如果我们想一次执行多个统计操作,那么我们可以在列表中传递它们。

# performing max() and min() operation,
# on the 'state_pop' column.
df_agg = df.groupby(
  level=["region", "state"])["state_pop"].agg(["max", "min"])
 
print(df_agg)

输出:

如何在Pandas中对一个多索引进行分组?

3. transform() in groupby:

transform()用于在一个给定的条件下对列进行转换。在transform函数中,我们必须传递一个负责执行特殊任务的函数。我们将使用lambda函数。

示例:

# defining the lambda function as 'score'
score  = (lambda x : (x / x.mean()))
 
# applying transform() on all the
# columns of DataFrame inside the
# transform(), passing the score
df_tra = df.groupby(level=["region"]).transform(score)
print(df_tra.head(10))

输出:

如何在Pandas中对一个多索引进行分组?

注意:有一个groupby操作的替代品,Pivot_table,它也是用来根据其他的列对第一列进行分组,但是如果我们想对分组进行统计分析,pivot table会更有用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程