如何在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的columns属性来了解数据框架的列。
# using pandas columns attribute.
col = df.columns
print(col)
输出 :
由于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())
输出 :
现在,DataFrame是一个多索引的DataFrame,有 “区域 “和 “状态 “列作为索引。
在多指标数据框架上使用Groupby操作
在这里,我们将用从0开始的编号索引来表示各层次。
# passing the level of indexes in
# the list to the level argument.
df.groupby(level=[0,1]).sum()
输出:
我们也可以传递列的名称,而不是级别编号。
# passing name of the index in
# the level argument.
y = df.groupby(level=['region'])['individuals'].mean()
print(y)
输出:
我们还可以用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)
输出:
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)
输出:
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))
输出:
注意:有一个groupby操作的替代品,Pivot_table,它也是用来根据其他的列对第一列进行分组,但是如果我们想对分组进行统计分析,pivot table会更有用。