pandas层次化索引
上一篇:pandas数据分析给力教程【完整版】(三)
下一篇:pandas数据分析给力教程【完整版】(五)
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
1. 创建多层行索引
1) 隐式构造
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
data = np.random.randint(0,150, size=(6,6))
index = [['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']]
columns = [['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']]
df = DataFrame(index=index, data=data, columns=columns)
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 96 | 6 | 27 | 29 | 32 | 129 |
李四 | 95 | 120 | 95 | 105 | 80 | 49 | |
王五 | 46 | 146 | 24 | 46 | 87 | 41 | |
二班 | 赵六 | 16 | 84 | 137 | 106 | 106 | 45 |
田七 | 114 | 80 | 16 | 118 | 7 | 38 | |
孙八 | 89 | 100 | 23 | 134 | 62 | 123 |
- Series也可以创建多层索引
index = [['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']]
data = np.random.randint(0,150, size=6)
s = Series(data=data, index=index)
s
一班 张三 145
李四 19
王五 148
二班 赵六 124
田七 9
孙八 114
dtype: int32
2) 显示构造pd.MultiIndex
- 使用数组
data = np.random.randint(0,150, size=(6,6))
index = pd.MultiIndex.from_arrays([['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']])
columns = pd.MultiIndex.from_arrays([['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']])
df = DataFrame(index=index, data=data, columns=columns)
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 72 | 138 | 109 | 138 | 32 | 94 |
李四 | 32 | 78 | 96 | 84 | 26 | 78 | |
王五 | 106 | 77 | 71 | 86 | 22 | 134 | |
二班 | 赵六 | 16 | 55 | 24 | 16 | 49 | 45 |
田七 | 81 | 57 | 78 | 10 | 100 | 89 | |
孙八 | 96 | 137 | 10 | 104 | 98 | 69 |
- 使用tuple
data = np.random.randint(0,150, size=(6,6))
index = pd.MultiIndex.from_tuples([('一班', '张三'), ('一班', '李四'), ('一班', '王五'), ('二班', '赵六'), ('二班', '田七'), ('二班', '孙八')])
columns = pd.MultiIndex.from_arrays([['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']])
df = DataFrame(index=index, data=data, columns=columns)
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 89 | 82 | 41 | 24 | 45 | 97 |
李四 | 110 | 20 | 117 | 29 | 5 | 141 | |
王五 | 73 | 34 | 30 | 137 | 80 | 145 | |
二班 | 赵六 | 122 | 1 | 32 | 10 | 136 | 113 |
田七 | 29 | 96 | 139 | 82 | 97 | 111 | |
孙八 | 82 | 51 | 2 | 126 | 25 | 123 |
-
使用product
最简单,推荐使用
data = np.random.randint(0,150, size=(6,6))
index = pd.MultiIndex.from_product([['一班', '二班'], ['张三', '李四', '王五']])
columns = pd.MultiIndex.from_arrays([['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']])
df = DataFrame(index=index, data=data, columns=columns)
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 142 | 3 | 101 | 83 | 56 | 37 |
李四 | 72 | 133 | 74 | 94 | 57 | 110 | |
王五 | 96 | 29 | 45 | 19 | 6 | 137 | |
二班 | 张三 | 146 | 121 | 100 | 81 | 119 | 141 |
李四 | 2 | 22 | 78 | 5 | 92 | 32 | |
王五 | 135 | 135 | 16 | 107 | 132 | 0 |
============================================
练习8:
- 创建一个DataFrame,表示出张三李四期中期末各科成绩
============================================
2. 多层列索引
除了行索引index,列索引columns也能用同样的方法创建多层索引
3. 多层索引对象的索引与切片操作
1)Series的操作
【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,推荐使用中括号索引和切片。
s
一班 张三 145
李四 19
王五 148
二班 赵六 124
田七 9
孙八 114
dtype: int32
(1) 索引
原则: 当有多层索引的时候,不要直接索引内层索引.
s.loc['张三']
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
d:\1903\.venv\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
2889 try:
-> 2890 return self._engine.get_loc(key)
2891 except KeyError:
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: '张三'
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
<ipython-input-11-73495c5352aa> in <module>
----> 1 s.loc['张三']
d:\1903\.venv\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key)
1408
1409 maybe_callable = com.apply_if_callable(key, self.obj)
-> 1410 return self._getitem_axis(maybe_callable, axis=axis)
1411
1412 def _is_scalar_access(self, key: Tuple):
d:\1903\.venv\lib\site-packages\pandas\core\indexing.py in _getitem_axis(self, key, axis)
1823 # fall thru to straight lookup
1824 self._validate_key(key, axis)
-> 1825 return self._get_label(key, axis=axis)
1826
1827
d:\1903\.venv\lib\site-packages\pandas\core\indexing.py in _get_label(self, label, axis)
151 # but will fail when the index is not present
152 # see GH5667
--> 153 return self.obj._xs(label, axis=axis)
154 elif isinstance(label, tuple) and isinstance(label[axis], slice):
155 raise IndexingError("no slices here, handle elsewhere")
d:\1903\.venv\lib\site-packages\pandas\core\generic.py in xs(self, key, axis, level, drop_level)
3734 index = self.index
3735 if isinstance(index, MultiIndex):
-> 3736 loc, new_index = self.index.get_loc_level(key, drop_level=drop_level)
3737 else:
3738 loc = self.index.get_loc(key)
d:\1903\.venv\lib\site-packages\pandas\core\indexes\multi.py in get_loc_level(self, key, level, drop_level)
2845 return indexer, maybe_droplevels(indexer, ilevels, drop_level)
2846 else:
-> 2847 indexer = self._get_level_indexer(key, level=level)
2848 return indexer, maybe_droplevels(indexer, [level], drop_level)
2849
d:\1903\.venv\lib\site-packages\pandas\core\indexes\multi.py in _get_level_indexer(self, key, level, indexer)
2928 else:
2929
-> 2930 code = level_index.get_loc(key)
2931
2932 if level > 0 or self.lexsort_depth == 0:
d:\1903\.venv\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
2890 return self._engine.get_loc(key)
2891 except KeyError:
-> 2892 return self._engine.get_loc(self._maybe_cast_indexer(key))
2893 indexer = self.get_indexer([key], method=method, tolerance=tolerance)
2894 if indexer.ndim > 1 or indexer.size > 1:
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: '张三'
# 先索引外层索引 推荐写法
s.loc['一班', '张三']
145
(2) 切片
# 不能直接切内层索引
s['张三': '李四']
Series([], dtype: int32)
s['一班': ]
一班 张三 145
李四 19
王五 148
二班 赵六 124
田七 9
孙八 114
dtype: int32
s.iloc[[0]]
一班 张三 145
dtype: int32
s.iloc[0:3]
一班 张三 145
李四 19
王五 148
dtype: int32
2)DataFrame的操作
(1) 可以直接使用列名称来进行列索引
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 142 | 3 | 101 | 83 | 56 | 37 |
李四 | 72 | 133 | 74 | 94 | 57 | 110 | |
王五 | 96 | 29 | 45 | 19 | 6 | 137 | |
二班 | 张三 | 146 | 121 | 100 | 81 | 119 | 141 |
李四 | 2 | 22 | 78 | 5 | 92 | 32 | |
王五 | 135 | 135 | 16 | 107 | 132 | 0 |
行多级索引的索引和切片操作
df.loc['一班', '张三']
期中 语文 142
数学 3
英语 101
期末 语文 83
数学 56
英语 37
Name: (一班, 张三), dtype: int32
df.loc['一班': '二班']
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 142 | 3 | 101 | 83 | 56 | 37 |
李四 | 72 | 133 | 74 | 94 | 57 | 110 | |
王五 | 96 | 29 | 45 | 19 | 6 | 137 | |
二班 | 张三 | 146 | 121 | 100 | 81 | 119 | 141 |
李四 | 2 | 22 | 78 | 5 | 92 | 32 | |
王五 | 135 | 135 | 16 | 107 | 132 | 0 |
df.iloc[[0]]
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 142 | 3 | 101 | 83 | 56 | 37 |
df.iloc[0:2]
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 142 | 3 | 101 | 83 | 56 | 37 |
李四 | 72 | 133 | 74 | 94 | 57 | 110 |
列多级索引的索引和切片操作
df['期中', '语文']
一班 张三 142
李四 72
王五 96
二班 张三 146
李四 2
王五 135
Name: (期中, 语文), dtype: int32
df.loc[:, '期中': '期末']
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 142 | 3 | 101 | 83 | 56 | 37 |
李四 | 72 | 133 | 74 | 94 | 57 | 110 | |
王五 | 96 | 29 | 45 | 19 | 6 | 137 | |
二班 | 张三 | 146 | 121 | 100 | 81 | 119 | 141 |
李四 | 2 | 22 | 78 | 5 | 92 | 32 | |
王五 | 135 | 135 | 16 | 107 | 132 | 0 |
df.iloc[:, 0:4]
期中 | 期末 | ||||
---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | ||
一班 | 张三 | 142 | 3 | 101 | 83 |
李四 | 72 | 133 | 74 | 94 | |
王五 | 96 | 29 | 45 | 19 | |
二班 | 张三 | 146 | 121 | 100 | 81 |
李四 | 2 | 22 | 78 | 5 | |
王五 | 135 | 135 | 16 | 107 |
(2) 使用行索引需要用loc()函数
【极其重要】推荐使用loc()函数
注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
============================================
练习9:
-
分析比较Series和DataFrame各种索引的方式,熟练掌握.loc()方法
-
假设张三再一次在期中考试的时候因为特殊原因放弃英语考试,如何实现?
============================================
DataFrame列索引用中括号,行索引用.loc[], 多层索引的时候,不要直接索引内层索引,而要从外层索引往里索引.
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 142 | 3 | 101 | 83 | 56 | 37 |
李四 | 72 | 133 | 74 | 94 | 57 | 110 | |
王五 | 96 | 29 | 45 | 19 | 6 | 137 | |
二班 | 张三 | 146 | 121 | 100 | 81 | 119 | 141 |
李四 | 2 | 22 | 78 | 5 | 92 | 32 | |
王五 | 135 | 135 | 16 | 107 | 132 | 0 |
df.loc['一班', '张三'].loc['期中', '英语'] = np.nan
df.loc[('一班', '张三'), ('期中', '语文')] = np.nan
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | NaN | 3.0 | NaN | 83.0 | 56.0 | 37.0 |
李四 | 72.0 | 133.0 | 74.0 | 94.0 | 57.0 | 110.0 | |
王五 | 96.0 | 29.0 | 45.0 | 19.0 | 6.0 | 137.0 | |
二班 | 张三 | 146.0 | 121.0 | 100.0 | 81.0 | 119.0 | 141.0 |
李四 | 2.0 | 22.0 | 78.0 | 5.0 | 92.0 | 32.0 | |
王五 | 135.0 | 135.0 | 16.0 | 107.0 | 132.0 | 0.0 |
df.dtypes
期中 语文 int32
数学 int32
英语 int32
期末 语文 int32
数学 int32
英语 int32
dtype: object
# 改变dataframe的类型
df = df.astype(dtype=np.float32)
df.loc['一班', '张三'].loc['期中', '英语'] = np.nan
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 142.0 | 3.0 | NaN | 83.0 | 56.0 | 37.0 |
李四 | 72.0 | 133.0 | 74.0 | 94.0 | 57.0 | 110.0 | |
王五 | 96.0 | 29.0 | 45.0 | 19.0 | 6.0 | 137.0 | |
二班 | 张三 | 146.0 | 121.0 | 100.0 | 81.0 | 119.0 | 141.0 |
李四 | 2.0 | 22.0 | 78.0 | 5.0 | 92.0 | 32.0 | |
王五 | 135.0 | 135.0 | 16.0 | 107.0 | 132.0 | 0.0 |
4. 索引的堆(stack)
stack()
unstack()
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | NaN | 3.0 | NaN | 83.0 | 56.0 | 37.0 |
李四 | 72.0 | 133.0 | 74.0 | 94.0 | 57.0 | 110.0 | |
王五 | 96.0 | 29.0 | 45.0 | 19.0 | 6.0 | 137.0 | |
二班 | 张三 | 146.0 | 121.0 | 100.0 | 81.0 | 119.0 | 141.0 |
李四 | 2.0 | 22.0 | 78.0 | 5.0 | 92.0 | 32.0 | |
王五 | 135.0 | 135.0 | 16.0 | 107.0 | 132.0 | 0.0 |
索引的堆指的就是 多层索引中行索引和列索引的转化
df.stack()
期中 | 期末 | |||
---|---|---|---|---|
一班 | 张三 | 数学 | 3.0 | 56.0 |
英语 | NaN | 37.0 | ||
语文 | NaN | 83.0 | ||
李四 | 数学 | 133.0 | 57.0 | |
英语 | 74.0 | 110.0 | ||
语文 | 72.0 | 94.0 | ||
王五 | 数学 | 29.0 | 6.0 | |
英语 | 45.0 | 137.0 | ||
语文 | 96.0 | 19.0 | ||
二班 | 张三 | 数学 | 121.0 | 119.0 |
英语 | 100.0 | 141.0 | ||
语文 | 146.0 | 81.0 | ||
李四 | 数学 | 22.0 | 92.0 | |
英语 | 78.0 | 32.0 | ||
语文 | 2.0 | 5.0 | ||
王五 | 数学 | 135.0 | 132.0 | |
英语 | 16.0 | 0.0 | ||
语文 | 135.0 | 107.0 |
df.unstack()
期中 | 期末 | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | |||||||||||||
张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | |
一班 | NaN | 72.0 | 96.0 | 3.0 | 133.0 | 29.0 | NaN | 74.0 | 45.0 | 83.0 | 94.0 | 19.0 | 56.0 | 57.0 | 6.0 | 37.0 | 110.0 | 137.0 |
二班 | 146.0 | 2.0 | 135.0 | 121.0 | 22.0 | 135.0 | 100.0 | 78.0 | 16.0 | 81.0 | 5.0 | 107.0 | 119.0 | 92.0 | 132.0 | 141.0 | 32.0 | 0.0 |
df.stack(level=0)
数学 | 英语 | 语文 | |||
---|---|---|---|---|---|
一班 | 张三 | 期中 | 3.0 | NaN | NaN |
期末 | 56.0 | 37.0 | 83.0 | ||
李四 | 期中 | 133.0 | 74.0 | 72.0 | |
期末 | 57.0 | 110.0 | 94.0 | ||
王五 | 期中 | 29.0 | 45.0 | 96.0 | |
期末 | 6.0 | 137.0 | 19.0 | ||
二班 | 张三 | 期中 | 121.0 | 100.0 | 146.0 |
期末 | 119.0 | 141.0 | 81.0 | ||
李四 | 期中 | 22.0 | 78.0 | 2.0 | |
期末 | 92.0 | 32.0 | 5.0 | ||
王五 | 期中 | 135.0 | 16.0 | 135.0 | |
期末 | 132.0 | 0.0 | 107.0 |
小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
============================================
练习10:
-
使用unstack()将ddd变为两行,分别为期中期末
-
使用unstack()将ddd变为四行,分别为四个科目
============================================
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | NaN | 3.0 | NaN | 83.0 | 56.0 | 37.0 |
李四 | 72.0 | 133.0 | 74.0 | 94.0 | 57.0 | 110.0 | |
王五 | 96.0 | 29.0 | 45.0 | 19.0 | 6.0 | 137.0 | |
二班 | 张三 | 146.0 | 121.0 | 100.0 | 81.0 | 119.0 | 141.0 |
李四 | 2.0 | 22.0 | 78.0 | 5.0 | 92.0 | 32.0 | |
王五 | 135.0 | 135.0 | 16.0 | 107.0 | 132.0 | 0.0 |
df.stack(level=0).unstack(level=0).unstack(level=0)
数学 | 英语 | 语文 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
一班 | 二班 | 一班 | 二班 | 一班 | 二班 | |||||||||||||
张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | |
期中 | 3.0 | 133.0 | 29.0 | 121.0 | 22.0 | 135.0 | NaN | 74.0 | 45.0 | 100.0 | 78.0 | 16.0 | NaN | 72.0 | 96.0 | 146.0 | 2.0 | 135.0 |
期末 | 56.0 | 57.0 | 6.0 | 119.0 | 92.0 | 132.0 | 37.0 | 110.0 | 137.0 | 141.0 | 32.0 | 0.0 | 83.0 | 94.0 | 19.0 | 81.0 | 5.0 | 107.0 |
df.stack().unstack(level=0).unstack(level=0)
期中 | 期末 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
一班 | 二班 | 一班 | 二班 | |||||||||
张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | 张三 | 李四 | 王五 | |
数学 | 3.0 | 133.0 | 29.0 | 121.0 | 22.0 | 135.0 | 56.0 | 57.0 | 6.0 | 119.0 | 92.0 | 132.0 |
英语 | NaN | 74.0 | 45.0 | 100.0 | 78.0 | 16.0 | 37.0 | 110.0 | 137.0 | 141.0 | 32.0 | 0.0 |
语文 | NaN | 72.0 | 96.0 | 146.0 | 2.0 | 135.0 | 83.0 | 94.0 | 19.0 | 81.0 | 5.0 | 107.0 |
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 104 | 3 | 2 | 32 | 72 | 24 |
李四 | 33 | 112 | 106 | 77 | 120 | 131 | |
王五 | 79 | 148 | 32 | 42 | 98 | 56 | |
二班 | 赵六 | 130 | 85 | 22 | 129 | 144 | 78 |
田七 | 49 | 49 | 23 | 120 | 148 | 116 | |
孙八 | 123 | 107 | 116 | 77 | 119 | 111 |
df.unstack()
df.stack().unstack(level=0, fill_value=0).unstack(level=0)
期中 | 期末 | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
一班 | 二班 | 一班 | 二班 | |||||||||||||||||||||
孙八 | 张三 | 李四 | 王五 | 田七 | 赵六 | 孙八 | 张三 | 李四 | 王五 | 田七 | 赵六 | 孙八 | 张三 | 李四 | 王五 | 田七 | 赵六 | 孙八 | 张三 | 李四 | 王五 | 田七 | 赵六 | |
数学 | 0 | 3 | 112 | 148 | 0 | 0 | 107 | 0 | 0 | 0 | 49 | 85 | 0 | 72 | 120 | 98 | 0 | 0 | 119 | 0 | 0 | 0 | 148 | 144 |
英语 | 0 | 2 | 106 | 32 | 0 | 0 | 116 | 0 | 0 | 0 | 23 | 22 | 0 | 24 | 131 | 56 | 0 | 0 | 111 | 0 | 0 | 0 | 116 | 78 |
语文 | 0 | 104 | 33 | 79 | 0 | 0 | 123 | 0 | 0 | 0 | 49 | 130 | 0 | 32 | 77 | 42 | 0 | 0 | 77 | 0 | 0 | 0 | 120 | 129 |
5. 聚合操作
data = np.random.randint(0,150, size=(6,3))
index = ['张三', '李四', '王五', '赵六', '田七', '孙八']
columns = ['语文', '数学', '英语']
df = DataFrame(index=index, data=data, columns=columns)
df
语文 | 数学 | 英语 | |
---|---|---|---|
张三 | 68 | 142 | 135 |
李四 | 104 | 140 | 53 |
王五 | 19 | 16 | 36 |
赵六 | 105 | 48 | 63 |
田七 | 139 | 8 | 85 |
孙八 | 66 | 76 | 136 |
sum / min /max / mean / std/ var/ prod/ median / percentile....
df.sum()
语文 501
数学 430
英语 508
dtype: int64
df.sum(axis=1)
张三 345
李四 297
王五 71
赵六 216
田七 232
孙八 278
dtype: int64
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 89 | 82 | 41 | 24 | 45 | 97 |
李四 | 110 | 20 | 117 | 29 | 5 | 141 | |
王五 | 73 | 34 | 30 | 137 | 80 | 145 | |
二班 | 赵六 | 122 | 1 | 32 | 10 | 136 | 113 |
田七 | 29 | 96 | 139 | 82 | 97 | 111 | |
孙八 | 82 | 51 | 2 | 126 | 25 | 123 |
df.sum()
期中 语文 505
数学 284
英语 361
期末 语文 408
数学 388
英语 730
dtype: int64
df.sum(axis=1)
一班 张三 378
李四 422
王五 499
二班 赵六 414
田七 554
孙八 409
dtype: int64
# 一班二班,各科成绩的和.
df.sum(axis=0, level=0)
# 先根据axis的值看对行还是对列进行 操作. 再去看level, level等于哪一层 ,哪一层就保留下来.
期中 | 期末 | |||||
---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | |
一班 | 272 | 136 | 188 | 190 | 130 | 383 |
二班 | 233 | 148 | 173 | 218 | 258 | 347 |
【注意】
-
需要指定axis
-
【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。
所谓的聚合操作:平均数,方差,最大值,最小值……
============================================
练习11:
-
计算各个科目期中期末平均成绩
-
计算各科目张三李四的最高分
============================================
df
期中 | 期末 | ||||||
---|---|---|---|---|---|---|---|
语文 | 数学 | 英语 | 语文 | 数学 | 英语 | ||
一班 | 张三 | 89 | 82 | 41 | 24 | 45 | 97 |
李四 | 110 | 20 | 117 | 29 | 5 | 141 | |
王五 | 73 | 34 | 30 | 137 | 80 | 145 | |
二班 | 赵六 | 122 | 1 | 32 | 10 | 136 | 113 |
田七 | 29 | 96 | 139 | 82 | 97 | 111 | |
孙八 | 82 | 51 | 2 | 126 | 25 | 123 |
df.mean(axis=1, level=1)
语文 | 数学 | 英语 | ||
---|---|---|---|---|
一班 | 张三 | 56.5 | 63.5 | 69.0 |
李四 | 69.5 | 12.5 | 129.0 | |
王五 | 105.0 | 57.0 | 87.5 | |
二班 | 赵六 | 66.0 | 68.5 | 72.5 |
田七 | 55.5 | 96.5 | 125.0 | |
孙八 | 104.0 | 38.0 | 62.5 |
df.max(axis=1, level=0).iloc[0:2]
期中 | 期末 | ||
---|---|---|---|
一班 | 张三 | 89 | 97 |
李四 | 117 | 141 |