机器学习科学数据包(三)——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