一、Pandas索引
1.行索引
#创建Series
s=np.Series(np.random.rand(5),index=list('abcde'))
#对行索引命名
s.index.name='alpha'
#获取行索引
s.index
2.列索引
df = pd.DataFrame(np.random.randn(4, 6), index=list('ADFH'), columns=['one', 'two', 'three', 'four', 'five', 'six'])
#行索引
df.index
#列索引
df.columns
3.索引类
pandas 中有许多内置索引,其中包括:
- pd.CategoricalIndex
- pd.DatetimeIndex
- pd.Float64Index
- pd.Index
- pd.Int64Index
- pd.IntervalIndex
- pd.MultiIndex
- pd.PeriodIndex
- pd.RangeIndex
- pd.TimedeltaIndex
- pd.UInt64Index
4.重复索引
可创建索引值重复的索引:
s=pd.Series(np.arrange(6),index=list('abcdea')
对于重复的索引值,依旧返回Series;
s['a']
对于非重复的索引值,则返回索引到的数据;
s['c']
- 判断 Series 中是否为唯一索引
s.index.is_unique
- 返回所有非重复的索引值的列表
s.index.unique()
5.多层索引
-
层次化索引
可以使数据在一个轴上有多个索引级别。即可以用二维的数据表达更高维度的数据,使数据组织方式更清晰。它使用 pd.MultiIndex 类来表示。 -
层次化索引有什么作用?
比如我们在分析股票数据,我们的一级行索引可以是日期;二级行索引可以是股票代码,列索引可以是股票的交易量,开盘价,收盘价等等。这样我们就可以把多个股票放在同一个时间维度下进行考察和分析。
1)创建
- Series多层索引的创建
[in]:
a = [['a', 'a', 'a', 'b', 'b', 'c', 'c'], [1, 2, 3, 1, 2, 2, 3]]
tuples = list(zip(*a))
tuples
[out]:
[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('c', 2), ('c', 3)]
[in]:
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
index
[out]:
MultiIndex(levels=[[u'a', u'b', u'c'], [1, 2, 3]],
labels=[[0, 0, 0, 1, 1, 2, 2], [0, 1, 2, 0, 1, 1, 2]],
names=[u'first', u'second'])
[in]:
s = pd.Series(np.random.randn(7), index=index)
s
[out]:
first second
a 1 -1.192113
2 0.226627
3 0.390052
b 1 0.045297
2 1.552926
c 2 0.014007
3 -0.257103
dtype: float64
由此就创建了一个多层索引数据
第一层索引’first’的索引值为a.b.c;
第二层索引‘second’的索引值为 1.2.3;
Series多层索引的使用:
例 1:
[in]:
s['b']
[out]:
second
1 0.045297
2 1.552926
dtype: float64
例 2:
[in]:
s['b':'c']
[out]:
first second
b 1 0.045297
2 1.552926
c 2 0.014007
3 -0.257103
dtype: float64
- DataFrame 多层索引的创建:
[in]:
df = pd.DataFrame(np.random.randint(1, 10, (4, 3)),
index=[['a', 'a', 'b', 'b'], ['A', 'B', 'A', 'B']],
columns=[['one', 'one', 'two'], ['blue', 'red', 'blue']])
df.index.names = ['row-1', 'row-2']
df.columns.names = ['col-1', 'col-2']
df
DataFrame多层索引的使用:
[in]:
df.loc['a','B']
[out]:
col-1 col-2
one blue 7
red 2
two blue 4
Name: (a, B), dtype: int64
2)索引交换
[in]:
df2 = df.swaplevel('row-1', 'row-2')
交换前:
交换后:
3)按照索引层次进行统计
#按照一级索引进行求和
df.sum(level=0)
#按照二级索引进行求和
df.sum(