group by是否会用到索引_pandas索引,分组计算

索引

1.行索引

#看一个一维数组的索引
s=pd.Series(np.random.randn(5),index=list('abcde'))
s
s.index#Series的索引
s.index.name='zrx'#给索引赋一个名字
#查询pandas里预置的索引的类
pd.*index?

2.重复索引

#重复索引
s=pd.Series(np.arange(6),index=list('abcabe'))
s
s['a']
out[10]:
a    0
a    3
dtype: int32


s.index.is_unique#判断索引里面有无重复的
s.groupby(s.index).sum()#处理重复索引,把重复索引求和
s.groupby(s.index).mean()#处理重复索引,把重复索引求平均
s.groupby(s.index).first()#处理重复索引,把重复索引只取第一项

3.层次化索引

可以使数据在一个轴上有多个索引级别。即可以用二维的数据表达更高维度的数据,使数据组织方式更清晰。它使用 pd.MultiIndex 类来表示。
比如我们在分析股票数据,我们的一级行索引可以是日期;二级行索引可以是股票代码,列索引可以是股票的交易量,开盘价,收盘价等等。这样我们就可以把多个股票放在同一个时间维度下进行考察和分析。

#多级索引pd.MultiIndex
a = [['a', 'a', 'a', 'b', 'b', 'c', 'c'], [1, 2, 3, 1, 2, 2, 3]]
tuples = list(zip(*a))#把两个列表组装成一个,列表里的元素是元组
tuples
index=pd.MultiIndex.from_tuples(tuples,names=['level1','level2'])
index
s=pd.Series(np.random.randn(7),index=index)
s
#选取一级索引
s['b']

s['b',2]

dataframe 多层索引

df = pd.DataFrame(np.random.randint(1, 10, (4, 3)), #选取1-10之间随机数,四行三列
                  index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]], 
                  columns=[['one', 'one', 'two'], ['blue', 'red', 'blue']])
df
df.index.names = ['row-1', 'row-2']
df.columns.names = ['col-1', 'col-2']

0d4e0f8053ec29c8ea4c41aed504fa86.png

交换索引

df2 = df.swaplevel('row-1', 'row-2')#交换索引
df2
df.sum(level=0)#根据第一级索引求和
df.sum(level=1)#根据第二级索引求和

索引列的转换

df = pd.DataFrame({
        'a': range(7),
        'b': range(7, 0, -1),
        'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
        'd': [0, 1, 2, 0, 1, 2, 3]
    })
df
df.set_index('c')#把c这一列当作索引值
df2 = df.set_index(['c', 'd'])#把c,d都设置为索引值
df2
df3 = df2.reset_index().sort_index('columns')#转换回来换成一个平面的dataframne
df3

分组计算

分组运算计算三步: 拆分->应用->合并

拆分:根据什么分组(按照键值(key)或者分组变量将数据分组。)

应用:每个分组进行什么样的运算(对于每组应用我们的函数,这一步非常灵活,可以是python自带函数,可以是我们自己编写的函数。

合并:把每个分组的运算合并起来(将函数计算后的结果聚合。)

核心:

1.不论分组键是数组、列表、字典、Series、函数,只要其与待分组变量的轴长度一致都可以传入groupby进行分组。

2.默认axis=0按行分组,可指定axis=1对列分组。

7ad519caafaafda3ada5508a714f94f6.png

1. 对Series进行分组

import pandas as pd
import numpy as np
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],
                  'key2': ['one', 'two', 'one', 'two', 'one'],
                  'data1': np.random.randint(1, 10, 5),
                  'data2': np.random.randint(1, 10, 5)})
df

2d6044d1ab53838201f1f6c482da6e4e.png
grouped = df['data1'].groupby(df['key1'])#用key1进行分组
grouped

实际上,在这一步,我们并没有进行任何计算仅仅是创建用key1分组后创建了一个groupby对象,我们后面函数的任何操作都是基于这个对象的。

grouped = df['data1'].groupby(df['key1']).mean()#用key1分组计算data1平均值
grouped

3f7df4b8a679870e41eef5d2864ad992.png

语法很简单,但是这里需要注意grouped的数据类型,它不再是一个数据框,而是一个groupby对象

df['data1'].groupby([df['key1'], df['key2']]).mean() #创建有多层索引的

6b7ef58f2149c5b9e752fc4f2f5e16e0.png

2. 对DataFrame进行分组

#对dtaframe进行分组
df.groupby('key1').mean()
means = df.groupby(['key1', 'key2']).mean()['data1']
means

e7cb4e502e1e0a29972833b4aeef0b6c.png

通过unstack方法进行结果重塑:

means.unstack()#生成的就是一个dataframe

ac7a37115fa71c1fdac3f79b20702a89.png

对分组进行迭代

GroupBy对象支持迭代操作,会产生一个由分组变量名和数据块组成的二元元组:

for name, group in df.groupby('key1'):#支持python迭代器协议
    #name分组的名字,group是是分组的数据
    print (name)
    print (group)

7e59f043ab8e2f9c56ed7677ea127c50.png
list(df.groupby(['key1','key2']))#转化成list

3.通过字典进行分组

#通过字典分组
df = pd.DataFrame(np.random.randint(1, 10, (5, 5)), 
                  columns=['a', 'b', 'c', 'd', 'e'], 
                  index=['zrx', 'dbw', 'lemon', 'mg', 'hzg'])
    
df

45d557b9731faabf382ded659254f084.png
df.loc[ 1:3] = np.NaN  #弄掉其中两行数据
df

8d7d744b9597214232a74f52a02ec92a.png

想按列进行聚合

我们根据实际情况,对列名建立字典,然后将此字典传入groupby,切记指定axis=1,因为我们是对列进行分组聚合:

mapping = {'a': 'apple', 'b': 'banana', 'c': 'candy', 'd': 'apple', 'e': 'banana'}#对列名建立字典,列名进行分组
grouped = df.groupby(mapping, axis=1) #然后将此字典传入groupby
grouped.sum() 

db458686574a5994c5d0fd8901a951f3.png
grouped.size() #每个有几列

4.通过函数进行分组

df = pd.DataFrame(np.random.randint(1, 10, (5, 5)), 
                  columns=['a', 'b', 'c', 'd', 'e'], 
                  index=['zrx', 'dbw', 'lemon', 'mg', 'hzg'])
                  
def _dummy_group(idx):
    print (idx)
    return (idx)#返回索引的值
df.groupby(_dummy_group)#按行分组,所以每一行索引不一样

6b9bd2c9414d4d4b7c894e1db2e9e57e.png
def _dummy_group(idx):
    print (idx)
    return (len(idx))
df.groupby(_dummy_group).size()#分组的name的长度

64be26e9ad8e9f1ffa595faed110db20.png

5.根据索引级别分组

刚刚我们的数据索引只有一级,当数据有多级索引时,可以通过level指定我们想要分组的索引,注意要使用axis=1表示按列:

#多级索引进行分组
columns = pd.MultiIndex.from_arrays([['rx', 'rx', 'rx', 'bw', 'bw'],['t-shirt', 'skirt', 'dress', 'shoes', 'underwear']], names=['name', 'type'])
df = pd.DataFrame(np.random.randint(1, 10, (5,5)), columns=columns)
df

54f41f27923adc744ee1b9fde221eb06.png

我们名字进行分组求和:

df.groupby(level='name', axis=1).sum()

25c715beaddd9965bdf756f3befc63f0.png

ps:转自CSDN博主:zrx1236

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值