机器学习科学数据包(三)——pandas索引、分组、聚合

机器学习科学数据包(三)——pandas索引

索引

为索引起名字: .index.name
行索引: .index
列索引: .columns
判断是否有重复索引: .index.is_unique

多级索引

以用二维的数据表达更高维度的数据,使数据组织方式更清晰。它使用 pd.MultiIndex 类来表示。

series 多级索引

创建多级索引:pd.MultiIndex.from_tuples(tuples,names=[‘name’,‘name’])
一级索引:.index.levels[0]
二级索引:.index.levels[1]

In [7]:
a=[['a','a','a','b','b','c','c'],[1,2,3,4,2,2,1]]
t=list(zip(*a))
t
Out[7]:
[('a', 1), ('a', 2), ('a', 3), ('b', 4), ('b', 2), ('c', 2), ('c', 1)]
In [9]:
index=pd.MultiIndex.from_tuples(t,names=['level1','level2'])
index
Out[9]:
MultiIndex(levels=[['a', 'b', 'c'], [1, 2, 3, 4]],
           labels=[[0, 0, 0, 1, 1, 2, 2], [0, 1, 2, 3, 1, 1, 0]],
           names=['level1', 'level2'])
In [10]:
s=pd.Series(np.random.rand(7),index=index)
s
Out[10]:
level1  level2
a       1         0.537610
        2         0.523798
        3         0.916160
b       4         0.840030
        2         0.141473
c       2         0.506391
        1         0.029494
dtype: float64
In [11]:
s[:,2]
Out[11]:
level1
a    0.523798
b    0.141473
c    0.506391
dtype: float64
Dataframe 多级索引
df=pd.DataFrame(np.random.randint(1,10,(4,3)),
               index=[['a','a','b','b'],[1,2,1,2]],
               columns=[['one','one','two'],['blue','red','blue']])
df.index.names=['row-1','row-2']
df.columns.names=['col-1','col-2']
df
Out[13]:
col-1	one	two
col-2	blue	red	blue
row-1	row-2			
a	1	7	2	4
2	9	6	4
b	1	3	5	3
2	1	5	9
In [15]:

df.loc['a']
Out[15]:
col-1	one	two
col-2	blue	red	blue
row-2			
1	7	2	4
2	9	6	4
索引交换​​​​​​​、排序、求和

索引交换: .swqplevel(’ ‘,’ ')
根据一级索引排序: .sortlevel(0)
根据一级索引求和: .sum(level=0)
将列索引变成行索引: .set_index(‘列’)
将行索引变回列索引: .reset_index()

分组

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

对Series进行分组
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
Out[18]:
key1	key2	data1	data2
0	a	one	2	4
1	a	two	9	9
2	b	one	5	2
3	b	two	3	2
4	a	one	2	1
In [20]:

df['data1'].groupby([df['key1'],df['key2']]).sum()
Out[20]:
key1  key2
a     one     4
      two     9
b     one     5
      two     3
Name: data1, dtype: int32
对DataFrame进行分组
df.groupby('key1').mean()
Out[21]:
data1	data2
key1		
a	4.333333	4.666667
b	4.000000	2.000000
In [22]:

df.groupby(df.dtypes,axis=1).sum()
Out[22]:
int32	object
0	6	aone
1	18	atwo
2	7	bone
3	5	btwo
4	3	aone
其他分组方法:
  • 通过字典分组
df=pd.DataFrame(np.random.randint(1,10,(5,5)),
               columns=['a','b','c','d','e'],
               index=['Alice','Bob','Candy','Dark','Emily'])
df.ix[1,1:3]=np.NaN
df
Out[23]:
a	b	c	d	e
Alice	2	7.0	2.0	2	9
Bob	4	NaN	NaN	5	8
Candy	7	9.0	5.0	4	3
Dark	8	6.0	4.0	6	4
Emily	8	2.0	7.0	7	5
In [24]:

mapping={'a':'red','b':'red','c':'blue','d':'orange','e':'blue'}
grouped=df.groupby(mapping,axis=1)
grouped.sum()
Out[24]:
blue	orange	red
Alice	11.0   2.0	9.0
Bob	    8.0	5.0	4.0
Candy	8.0	4.0	16.0
Dark	8.0	6.0	14.0
Emily	12.0	7.0	10.0
  • 通过函数分组
def _group_key(idx):
    print (idx)
    return idx
df.groupby(_group_key).size()

Out[27]:
Alice    1
Bob      1
Candy    1
Dark     1
Emily    1
dtype: int64

*通过索引级别分组

columns=pd.MultiIndex.from_arrays([['China','USA','China','USA','China'],
                                    ['A','A','B','C','B']],
                                   names=['country','index'])
df=pd.DataFrame(np.random.randint(1,10,(5,5)),columns=columns)
df
Out[28]:
country	China	USA	China	USA	China
index	A	A	B	C	B
0	4	1	7	8	4
1	5	5	1	3	9
2	2	6	8	2	2
3	3	8	6	4	1
4	2	7	1	2	9
In [30]:

df.groupby(level='country',axis=1).sum()
Out[30]:
country	China	USA
0	15	9
1	15	8
2	12	8
3	10	12
4	12	9

聚合

聚合时,拆分后的第一个索引指定的数据都会依次传给聚合函数进行运算。最后再把运算结果合并起来,生成最终结果。
内置聚合函数:sum(), min(), max(), mean() 、describe()(用多个内置函数进行描述) 、还可以自定义聚合函数。自定义聚合函数时,使用 agg() 或 aggregate() 函数。

自定义聚合函数

在这里插入图片描述

给不同的列应用不同的聚合函数

在这里插入图片描述

  • 重置列名称

在这里插入图片描述

  • transform
    在这里插入图片描述
  • apply
states=['Ohio','New York','Vermont','Florida',
       'Oregon','Nevada','California','Idaho']
group_key=['East']*4+['West']*4
data=pd.Series(np.random.randn(8),index=states)
data[['Vermont','Nevada','Idaho']]=np.nan
data
Out[31]:
Ohio          0.701878
New York     -0.899161
Vermont            NaN
Florida       0.500492
Oregon        0.237613
Nevada             NaN
California   -0.640483
Idaho              NaN
dtype: float64
In [32]:

data.groupby(group_key).mean()
Out[32]:
East    0.101070
West   -0.201435
dtype: float64
In [33]:

data.groupby(group_key).apply(lambda g:g.fillna(g.mean()))
Out[33]:
Ohio          0.701878
New York     -0.899161
Vermont       0.101070
Florida       0.500492
Oregon        0.237613
Nevada       -0.201435
California   -0.640483
Idaho        -0.201435
dtype: float64
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值