import pandas as pd # 引入 pandas 库,按惯例起别名 pd
# 以下两种效果一样,如果是网址它会自动下载数据到内存
df = pd.read_excel('https://www.getwage.xyz/courses/multi_variance/data/team.xlsx')
#df = pd.read_excel(r'data/team.xlsx') # 文件在 notebook 文件同一目录下
# 如果是 csv 的话使用 pd.read_csv() ,还支持很多类型的数据读取
df.to_csv(r"data\team.csv")
df
| name | team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|---|
| 0 | Liver | E | 89 | 21 | 24 | 64 |
| 1 | Arry | C | 36 | 37 | 37 | 57 |
| 2 | Ack | A | 57 | 60 | 18 | 84 |
| 3 | Eorge | C | 93 | 96 | 71 | 78 |
| 4 | Oah | D | 65 | 49 | 61 | 86 |
| ... | ... | ... | ... | ... | ... | ... |
| 95 | Gabriel | C | 48 | 59 | 87 | 74 |
| 96 | Austin7 | C | 21 | 31 | 30 | 43 |
| 97 | Lincoln4 | C | 98 | 93 | 1 | 20 |
| 98 | Eli | E | 11 | 74 | 58 | 91 |
| 99 | Ben | E | 21 | 43 | 41 | 74 |
100 rows × 6 columns
df.to_markdown("team.md")
数据用Markdow格式显示¶
| name | team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|---|
| 0 | Liver | E | 89 | 21 | 24 | 64 |
| 1 | Arry | C | 36 | 37 | 37 | 57 |
| 2 | Ack | A | 57 | 60 | 18 | 84 |
| 3 | Eorge | C | 93 | 96 | 71 | 78 |
| 4 | Oah | D | 65 | 49 | 61 | 86 |
| 5 | Harlie | C | 24 | 13 | 87 | 43 |
| 6 | Acob | B | 61 | 95 | 94 | 8 |
| 7 | Lfie | A | 9 | 10 | 99 | 37 |
| 8 | Reddie | D | 64 | 93 | 57 | 72 |
| 9 | Oscar | A | 77 | 9 | 26 | 67 |
| 10 | Leo | B | 17 | 4 | 33 | 79 |
| 11 | Logan | B | 9 | 89 | 35 | 65 |
| 12 | Archie | C | 83 | 89 | 59 | 68 |
| 13 | Theo | C | 51 | 86 | 87 | 27 |
| 14 | Thomas | B | 80 | 48 | 56 | 41 |
| 15 | James | E | 48 | 77 | 52 | 11 |
| 16 | Joshua | A | 63 | 4 | 80 | 30 |
| 17 | Henry | A | 91 | 15 | 75 | 17 |
| 18 | William | C | 80 | 68 | 3 | 26 |
| 19 | Max | E | 97 | 75 | 41 | 3 |
| 20 | Lucas | A | 60 | 41 | 77 | 62 |
| 21 | Ethan | D | 79 | 45 | 89 | 88 |
| 22 | Arthur | A | 44 | 53 | 42 | 40 |
| 23 | Mason | D | 80 | 96 | 26 | 49 |
| 24 | Isaac | E | 74 | 23 | 28 | 65 |
| 25 | Harrison | B | 89 | 13 | 18 | 75 |
| 26 | Teddy | E | 71 | 91 | 21 | 48 |
| 27 | Finley | D | 62 | 73 | 84 | 68 |
| 28 | Daniel | C | 50 | 50 | 72 | 61 |
| 29 | Riley | E | 35 | 26 | 59 | 83 |
| 30 | Edward | B | 57 | 38 | 86 | 87 |
| 31 | Joseph | E | 67 | 87 | 87 | 93 |
| 32 | Alexander | C | 91 | 76 | 26 | 79 |
| 33 | Adam | C | 90 | 32 | 47 | 39 |
| 34 | Reggie1 | A | 30 | 12 | 23 | 9 |
| 35 | Samuel | B | 9 | 38 | 88 | 66 |
| 36 | Jaxon | E | 88 | 98 | 19 | 98 |
| 37 | Sebastian | C | 1 | 14 | 68 | 48 |
| 38 | Elijah | B | 97 | 89 | 15 | 46 |
| 39 | Harley | B | 2 | 99 | 12 | 13 |
| 40 | Toby | A | 52 | 27 | 17 | 68 |
| 41 | Arlo8 | E | 48 | 34 | 52 | 51 |
| 42 | Dylan | A | 86 | 87 | 65 | 20 |
| 43 | Jude | E | 8 | 45 | 13 | 65 |
| 44 | Benjamin | D | 15 | 88 | 52 | 25 |
| 45 | Rory9 | E | 8 | 12 | 58 | 27 |
| 46 | Tommy | C | 29 | 44 | 28 | 76 |
| 47 | Jake3 | C | 69 | 23 | 11 | 40 |
| 48 | Louie | D | 24 | 84 | 54 | 11 |
| 49 | Carter7 | D | 57 | 52 | 77 | 50 |
| 50 | Jenson | B | 66 | 77 | 88 | 74 |
| 51 | Hugo0 | A | 28 | 25 | 14 | 71 |
| 52 | Bobby1 | D | 50 | 55 | 60 | 59 |
| 53 | Frankie | B | 18 | 62 | 52 | 33 |
| 54 | Ollie3 | C | 10 | 76 | 30 | 36 |
| 55 | Zachary | E | 12 | 71 | 85 | 93 |
| 56 | David | B | 21 | 47 | 99 | 2 |
| 57 | Albie1 | D | 79 | 82 | 56 | 96 |
| 58 | Lewis | B | 4 | 34 | 77 | 28 |
| 59 | Luca | D | 5 | 40 | 91 | 83 |
| 60 | Ronnie | B | 53 | 13 | 34 | 99 |
| 61 | Jackson5 | E | 6 | 10 | 15 | 33 |
| 62 | Matthew | C | 44 | 33 | 41 | 98 |
| 63 | Alex | D | 14 | 70 | 55 | 87 |
| 64 | Harvey2 | B | 43 | 76 | 87 | 90 |
| 65 | Reuben | D | 70 | 72 | 76 | 56 |
| 66 | Jayden6 | D | 64 | 21 | 10 | 21 |
| 67 | Caleb | A | 64 | 34 | 46 | 88 |
| 68 | Hunter3 | D | 38 | 80 | 82 | 40 |
| 69 | Theodore3 | D | 43 | 7 | 68 | 80 |
| 70 | Nathan | A | 87 | 77 | 62 | 13 |
| 71 | Blake | A | 78 | 23 | 93 | 9 |
| 72 | Luke6 | D | 15 | 97 | 95 | 99 |
| 73 | Elliot | C | 15 | 17 | 76 | 22 |
| 74 | Roman | E | 73 | 1 | 25 | 44 |
| 75 | Stanley | A | 69 | 71 | 39 | 97 |
| 76 | Dexter | E | 73 | 94 | 53 | 20 |
| 77 | Michael | B | 89 | 21 | 59 | 92 |
| 78 | Elliott | B | 9 | 31 | 33 | 60 |
| 79 | Tyler | A | 75 | 16 | 44 | 63 |
| 80 | Ryan | E | 92 | 70 | 64 | 31 |
| 81 | Ellis | C | 34 | 34 | 77 | 42 |
| 82 | Finn | E | 4 | 1 | 55 | 32 |
| 83 | Albert0 | B | 85 | 38 | 41 | 17 |
| 84 | Kai | B | 66 | 45 | 13 | 48 |
| 85 | Liam | B | 2 | 80 | 24 | 25 |
| 86 | Calum | C | 14 | 91 | 16 | 82 |
| 87 | Louis2 | C | 13 | 94 | 51 | 22 |
| 88 | Aaron | A | 96 | 75 | 55 | 8 |
| 89 | Ezra | D | 16 | 56 | 86 | 61 |
| 90 | Leon | E | 38 | 60 | 31 | 7 |
| 91 | Connor | C | 62 | 38 | 63 | 46 |
| 92 | Grayson7 | B | 59 | 84 | 74 | 33 |
| 93 | Jamie0 | B | 39 | 97 | 84 | 55 |
| 94 | Aiden | D | 20 | 31 | 62 | 68 |
| 95 | Gabriel | C | 48 | 59 | 87 | 74 |
| 96 | Austin7 | C | 21 | 31 | 30 | 43 |
| 97 | Lincoln4 | C | 98 | 93 | 1 | 20 |
| 98 | Eli | E | 11 | 74 | 58 | 91 |
| 99 | Ben | E | 21 | 43 | 41 | 74 |
数据说明
这是一个学生各季度成绩总表(节选),各列说明:
name: 学生的姓名,这列没有重复值,一个学生一行,即一条数据,共 100 条 team: 所在的团队、班级,这个数据 会重复 Q1 - Q4: 各个季度的成绩,各个成绩可能会重复
df.head()
| name | team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|---|
| 0 | Liver | E | 89 | 21 | 24 | 64 |
| 1 | Arry | C | 36 | 37 | 37 | 57 |
| 2 | Ack | A | 57 | 60 | 18 | 84 |
| 3 | Eorge | C | 93 | 96 | 71 | 78 |
| 4 | Oah | D | 65 | 49 | 61 | 86 |
df.head(8)
| name | team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|---|
| 0 | Liver | E | 89 | 21 | 24 | 64 |
| 1 | Arry | C | 36 | 37 | 37 | 57 |
| 2 | Ack | A | 57 | 60 | 18 | 84 |
| 3 | Eorge | C | 93 | 96 | 71 | 78 |
| 4 | Oah | D | 65 | 49 | 61 | 86 |
| 5 | Harlie | C | 24 | 13 | 87 | 43 |
| 6 | Acob | B | 61 | 95 | 94 | 8 |
| 7 | Lfie | A | 9 | 10 | 99 | 37 |
df.sample(20)
| name | team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|---|
| 77 | Michael | B | 89 | 21 | 59 | 92 |
| 22 | Arthur | A | 44 | 53 | 42 | 40 |
| 27 | Finley | D | 62 | 73 | 84 | 68 |
| 89 | Ezra | D | 16 | 56 | 86 | 61 |
| 36 | Jaxon | E | 88 | 98 | 19 | 98 |
| 80 | Ryan | E | 92 | 70 | 64 | 31 |
| 59 | Luca | D | 5 | 40 | 91 | 83 |
| 1 | Arry | C | 36 | 37 | 37 | 57 |
| 6 | Acob | B | 61 | 95 | 94 | 8 |
| 45 | Rory9 | E | 8 | 12 | 58 | 27 |
| 11 | Logan | B | 9 | 89 | 35 | 65 |
| 55 | Zachary | E | 12 | 71 | 85 | 93 |
| 67 | Caleb | A | 64 | 34 | 46 | 88 |
| 73 | Elliot | C | 15 | 17 | 76 | 22 |
| 58 | Lewis | B | 4 | 34 | 77 | 28 |
| 19 | Max | E | 97 | 75 | 41 | 3 |
| 41 | Arlo8 | E | 48 | 34 | 52 | 51 |
| 90 | Leon | E | 38 | 60 | 31 | 7 |
| 68 | Hunter3 | D | 38 | 80 | 82 | 40 |
| 54 | Ollie3 | C | 10 | 76 | 30 | 36 |
df.shape
(100, 6)
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 100 entries, 0 to 99 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 100 non-null object 1 team 100 non-null object 2 Q1 100 non-null int64 3 Q2 100 non-null int64 4 Q3 100 non-null int64 5 Q4 100 non-null int64 dtypes: int64(4), object(2) memory usage: 4.8+ KB
df.dtypes # 查看各字段类型
name object team object Q1 int64 Q2 int64 Q3 int64 Q4 int64 dtype: object
df.axes # 显示数据行和列名
df.axes[0]
RangeIndex(start=0, stop=100, step=1)
df.axes[1]
Index(['name', 'team', 'Q1', 'Q2', 'Q3', 'Q4'], dtype='object')
df.index
RangeIndex(start=0, stop=100, step=1)
df.columns # 列名
Index(['name', 'team', 'Q1', 'Q2', 'Q3', 'Q4'], dtype='object')
建立索引¶
以上数据真正业务意义上的索引是 name 列,所以我们需要使它成功索引:
df.set_index('name', inplace=True) # 建立索引并
效 其中可选参数 inplace=True 会将指定好索引的数据再赋值给 df 使索引生效,否则不会生效。注意,我们这儿并没有对原 excel 做修改,从我们读取数据后就已经和它没有关系了,我们处理的是内存中 df 变量。
df.set_index('name', inplace=True)
df.head()
| team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| name | |||||
| Liver | E | 89 | 21 | 24 | 64 |
| Arry | C | 36 | 37 | 37 | 57 |
| Ack | A | 57 | 60 | 18 | 84 |
| Eorge | C | 93 | 96 | 71 | 78 |
| Oah | D | 65 | 49 | 61 | 86 |
数据选取¶
现在,我们可以像使用Excel一样对数据进行选择和规整,与Excel不同的是不是应用鼠标,而是应用程序。这样的优势在于,我们可与一劳永逸形成程序性、可复制性的数据处理规范方法。
总体筛选
df.head(n) # 查看 DataFrame 对象的前n行
df.tail(n) # 查看 DataFrame 对象的最后n行
df.sample(n) # 查看 n 个样本,选择
具体示例见上面示例。
选择列
# 查看指定列
df['Q1']
df.Q1 # 同上,如果列名符合 python 变量名要求,可
示例如下:使用
df['Q1']
name
Liver 89
Arry 36
Ack 57
Eorge 93
Oah 65
..
Gabriel 48
Austin7 21
Lincoln4 98
Eli 11
Ben 21
Name: Q1, Length: 100, dtype: int64
这里返回的是一个 Series 类型数据, 可以理解为数列,它也是带索引的,我们在之前建立了索引,在这儿发挥出了作用,不然我们索引是一个数字,我们无法知道是谁的数据。
# 选择多列
df[['team', 'Q1']] # 只看这两列,注意括号
#df.loc[:, ['team', 'Q1']] # 和上边效果一样
| team | Q1 | |
|---|---|---|
| name | ||
| Liver | E | 89 |
| Arry | C | 36 |
| Ack | A | 57 |
| Eorge | C | 93 |
| Oah | D | 65 |
| ... | ... | ... |
| Gabriel | C | 48 |
| Austin7 | C | 21 |
| Lincoln4 | C | 98 |
| Eli | E | 11 |
| Ben | E | 21 |
100 rows × 2 columns
df.loc[x, y] 是一个非常强大的数据选择函数,其中 x代表行,y 代表列,行和列都支持条件表达式,也支持类似列表那样的切片(如果要用自然索引需要用 df.iloc[])。下边的例子中会进行演示。
选择行
# 用人工索引选取
df[df.index == "Liver"] # 指定索引
| team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| name | |||||
| Liver | E | 89 | 21 | 24 | 64 |
# 用自然索引选择,类似列表的切片
df[0:3] # 取前三行,
| team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| name | |||||
| Liver | E | 89 | 21 | 24 | 64 |
| Arry | C | 36 | 37 | 37 | 57 |
| Ack | A | 57 | 60 | 18 | 84 |
df[0:10:2] # 前10个,每两个取一个
| team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| name | |||||
| Liver | E | 89 | 21 | 24 | 64 |
| Ack | A | 57 | 60 | 18 | 84 |
| Oah | D | 65 | 49 | 61 | 86 |
| Acob | B | 61 | 95 | 94 | 8 |
| Reddie | D | 64 | 93 | 57 | 72 |
df.iloc[:10,:] # 前10个
| team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| name | |||||
| Liver | E | 89 | 21 | 24 | 64 |
| Arry | C | 36 | 37 | 37 | 57 |
| Ack | A | 57 | 60 | 18 | 84 |
| Eorge | C | 93 | 96 | 71 | 78 |
| Oah | D | 65 | 49 | 61 | 86 |
| Harlie | C | 24 | 13 | 87 | 43 |
| Acob | B | 61 | 95 | 94 | 8 |
| Lfie | A | 9 | 10 | 99 | 37 |
| Reddie | D | 64 | 93 | 57 | 72 |
| Oscar | A | 77 | 9 | 26 | 67 |
指定行列
df.loc['Ben', 'Q1':'Q4'] # 只看 Ben 的四个季度成绩
Q1 21 Q2 43 Q3 41 Q4 74 Name: Ben, dtype: object
df.loc['Eorge':'Alexander', 'team':'Q4'] # 指定行区间
| team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| name | |||||
| Eorge | C | 93 | 96 | 71 | 78 |
| Oah | D | 65 | 49 | 61 | 86 |
| Harlie | C | 24 | 13 | 87 | 43 |
| Acob | B | 61 | 95 | 94 | 8 |
| Lfie | A | 9 | 10 | 99 | 37 |
| Reddie | D | 64 | 93 | 57 | 72 |
| Oscar | A | 77 | 9 | 26 | 67 |
| Leo | B | 17 | 4 | 33 | 79 |
| Logan | B | 9 | 89 | 35 | 65 |
| Archie | C | 83 | 89 | 59 | 68 |
| Theo | C | 51 | 86 | 87 | 27 |
| Thomas | B | 80 | 48 | 56 | 41 |
| James | E | 48 | 77 | 52 | 11 |
| Joshua | A | 63 | 4 | 80 | 30 |
| Henry | A | 91 | 15 | 75 | 17 |
| William | C | 80 | 68 | 3 | 26 |
| Max | E | 97 | 75 | 41 | 3 |
| Lucas | A | 60 | 41 | 77 | 62 |
| Ethan | D | 79 | 45 | 89 | 88 |
| Arthur | A | 44 | 53 | 42 | 40 |
| Mason | D | 80 | 96 | 26 | 49 |
| Isaac | E | 74 | 23 | 28 | 65 |
| Harrison | B | 89 | 13 | 18 | 75 |
| Teddy | E | 71 | 91 | 21 | 48 |
| Finley | D | 62 | 73 | 84 | 68 |
| Daniel | C | 50 | 50 | 72 | 61 |
| Riley | E | 35 | 26 | 59 | 83 |
| Edward | B | 57 | 38 | 86 | 87 |
| Joseph | E | 67 | 87 | 87 | 93 |
| Alexander | C | 91 | 76 | 26 | 79 |
条件选择
# 单一条件
df[df.Q1 > 90] # Q1 列大于90的
#df[df.team == 'C'] # team 列为 'C' 的
#df[df.index == 'Oscar'] # 指定索引即原数据中的 name
| team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| name | |||||
| Eorge | C | 93 | 96 | 71 | 78 |
| Henry | A | 91 | 15 | 75 | 17 |
| Max | E | 97 | 75 | 41 | 3 |
| Alexander | C | 91 | 76 | 26 | 79 |
| Elijah | B | 97 | 89 | 15 | 46 |
| Ryan | E | 92 | 70 | 64 | 31 |
| Aaron | A | 96 | 75 | 55 | 8 |
| Lincoln4 | C | 98 | 93 | 1 | 20 |
# 组合条件
df[(df['Q1'] > 90) & (df['team'] == 'C')] # and 关系
df[df['team'] == 'C'].loc[df.Q1>90] # 多重筛选
| team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| name | |||||
| Eorge | C | 93 | 96 | 71 | 78 |
| Alexander | C | 91 | 76 | 26 | 79 |
| Lincoln4 | C | 98 | 93 | 1 | 20 |
排序
df.sort_values(by='Q1') # 按 Q1 列数据升序排列
df.sort_values(by='Q1', ascending=False) # 降序
df.sort_values(['team', 'Q1'], ascending=[True, False]) # team 升,Q1 降序
| team | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| name | |||||
| Aaron | A | 96 | 75 | 55 | 8 |
| Henry | A | 91 | 15 | 75 | 17 |
| Nathan | A | 87 | 77 | 62 | 13 |
| Dylan | A | 86 | 87 | 65 | 20 |
| Blake | A | 78 | 23 | 93 | 9 |
| ... | ... | ... | ... | ... | ... |
| Eli | E | 11 | 74 | 58 | 91 |
| Jude | E | 8 | 45 | 13 | 65 |
| Rory9 | E | 8 | 12 | 58 | 27 |
| Jackson5 | E | 6 | 10 | 15 | 33 |
| Finn | E | 4 | 1 | 55 | 32 |
100 rows × 5 columns
分组聚合
我们可以实现类似 SQL groupby 那样的数据透视功能:
df.groupby('team').sum() # 按团队分组对应列相加
df.groupby('team').mean() # 按团队分组对应列求平均
# 不同列不同的计算方法
df.groupby('team').agg({'Q1': sum, # 总和
'Q2': 'count', # 总数
'Q3':'mean', # 平均
'Q4': max}) # 最大值
数据转换
可以对数据表进行转置,以 A-Q1 和 E-Q4 为两点组成的折线为轴对数据进行旋转:
df.groupby('team').sum().T
| team | A | B | C | D | E |
|---|---|---|---|---|---|
| Q1 | 1066 | 975 | 1056 | 860 | 963 |
| Q2 | 639 | 1218 | 1194 | 1191 | 1013 |
| Q3 | 875 | 1202 | 1068 | 1241 | 881 |
| Q4 | 783 | 1136 | 1127 | 1199 | 1033 |
df.groupby('team').sum().stack()
df.groupby('team').sum().unstack()
team
Q1 A 1066
B 975
C 1056
D 860
E 963
Q2 A 639
B 1218
C 1194
D 1191
E 1013
Q3 A 875
B 1202
C 1068
D 1241
E 881
Q4 A 783
B 1136
C 1127
D 1199
E 1033
dtype: int64
增加列
Pandas 增加一列非常方便,就是新定义一个字典的键值一样。
df['one'] = 1 # 增加一个固定值的列
df['total'] = df.Q1 + df.Q2 + df.Q3 + df.Q4 # 增加总成绩列
# 指定一些列相加增加一个新列
df['total'] = df.loc[:,'Q1':'Q4'].apply(lambda x:sum(x), axis=1)
#df['total'] = df.sum(axis=1) # 可以把所有为数字的列相加
df['avg'] = df.total/4 # 增加平均成绩列
df.head()
| team | Q1 | Q2 | Q3 | Q4 | one | total | avg | |
|---|---|---|---|---|---|---|---|---|
| name | ||||||||
| Liver | E | 89 | 21 | 24 | 64 | 1 | 198 | 49.50 |
| Arry | C | 36 | 37 | 37 | 57 | 1 | 167 | 41.75 |
| Ack | A | 57 | 60 | 18 | 84 | 1 | 219 | 54.75 |
| Eorge | C | 93 | 96 | 71 | 78 | 1 | 338 | 84.50 |
| Oah | D | 65 | 49 | 61 | 86 | 1 | 261 | 65.25 |
简单分析
根据你的数据分析目标,试着使用以下函数,然后看看能得到什么结论吧。
df.mean() # 返回所有列的均值
df.mean(1) # 返回所有行的均值,下同
df.corr() # 返回列与列之间的相关系数
df.count() # 返回每一列中的非空值的个数
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.median() # 返回每一列的中位数
df.std() # 返回每一列的标准差
df.var() # 方差
s.mode() # 众数
画图
Pandas 利用plot() 调用 matplotlib 快速绘制出数据可视化图形。
df['Q1'].plot() # Q1 成绩的折线分布
#如果直接出图,没有相关提示的话,需要在最后加上分号。
<Axes: xlabel='name'>
df.loc['Ben','Q1':'Q4'].plot(); # ben 四个季度的成绩变化
df.loc[ 'Ben','Q1':'Q4'].plot.bar() # 柱状图
<Axes: >
df.loc[ 'Ben','Q1':'Q4'].plot.barh(); # 横向柱状图
df.groupby('team').sum().T.plot(); # 各 Team 四个季度总成绩趋势
df.groupby('team').count().Q1.plot.pie(); # 各组人数对比
输出
可以非常轻松地导出 Excel 和 CSV 文件。
#df.to_excel('team-done.xlsx') # 导出 excel
df.to_csv('data/team-done.csv') # 导出 csv