import pandas as pd import numpy as np from pandas import Dataframe
============================================
练习1:
使用多种方法创建以下Series,命名为s1:
语文 150
数学 150
英语 150
理综 300
============================================
# 列表创建
pd.Series(data=[150,150,150,300],index=['语文','数学','英语','理综'],name='s1')
语文 150 数学 150 英语 150 理综 300 Name: s1, dtype: int64
# 字典创建
dicts={'语文':150,'数学':150,'英语':150,'理综':300,}
s1=pd.Series(data=dicts,name='s1')
s1
语文 150 数学 150 英语 150 理综 300 Name: s1, dtype: int64
============================================
练习2:
使用多种方法对练习1创建的Series s1进行索引和切片:
索引:
数学 150
切片:
语文 150
数学 150
英语 150
============================================
s1.loc['数学']
150
s1.iloc[1]
150
s1[1]
150
s1['数学']
150
s1.values
array([150, 150, 150, 300], dtype=int64)
s1.keys()
Index(['语文', '数学', '英语', '理综'], dtype='object')
print(s1[:3])
语文 150 数学 150 英语 150 Name: s1, dtype: int64
s1[-2::-1]
英语 150 数学 150 语文 150 Name: s1, dtype: int64
============================================
练习3:
-
想一想Series运算和ndarray运算的规则有什么不同?
-
新建另一个索引包含“文综”的Series s2,并与s2进行多种算术操作。思考如何保存所有数据。
============================================
1.由于pandas的底层是集成了numpy,因此Series的底层数据就是使用ndarray来构建的,因此我们得到了一个Series后,就可以使用numpy中的函数,对数据进行操作。但是Series与ndarry不同的地方在于,Series中多了一个索引。
这些问题都是细节问题,只有熟悉了这些细节知识,对于我们熟练使用numpy和pandas都是由很大帮助的。Series的底层数据就是由ndarray来构建的,而Dataframe又是由一个个的Series堆积而成的,随意取出Dataframe每一行或者每一列数据,都是一个Series。
2.新建另一个索引包含“文综”的Series s2,并与s2进行多种算术操作。
s2=pd.Series(data=np.random.randint(100,150,size=5),index=['语文','数学','英语','理综','文综'],name='s2') s2
语文 144 数学 103 英语 113 理综 115 文综 105 Name: s2, dtype: int32
s1
语文 150 数学 150 英语 150 理综 300 Name: s1, dtype: int64
s1+s2 # Pandas进行数据运算时,会按照索引进行一一对应,对应后进行相应的算术运算,没有对齐的位置就会用NaN进行填充。
数学 253.0 文综 NaN 理综 415.0 英语 263.0 语文 294.0 dtype: float64
# add函数就是指是s1+s2。对于s1来说,没有文综列,由于使用的是fill_value = 0,因此用 “0”来填充df1的e列,105+0=105 s1.add(s2,fill_value=0) # 加
数学 253.0 文综 105.0 理综 415.0 英语 263.0 语文 294.0 dtype: float64
s1*s2
数学 15450.0 文综 NaN 理综 34500.0 英语 16950.0 语文 21600.0 dtype: float64
s1.mul(s2,fill_value=1) # 乘
数学 15450.0 文综 105.0 理综 34500.0 英语 16950.0 语文 21600.0 dtype: float64
s1-s2
数学 47.0 文综 NaN 理综 185.0 英语 37.0 语文 6.0 dtype: float64
s1.sub(s2,fill_value=0) # 减
数学 47.0 文综 -105.0 理综 185.0 英语 37.0 语文 6.0 dtype: float64
s1/s2
数学 1.456311 文综 NaN 理综 2.608696 英语 1.327434 语文 1.041667 dtype: float64
s1.div(s2,fill_value=1) # 除
数学 1.456311 文综 0.009524 理综 2.608696 英语 1.327434 语文 1.041667 dtype: float64
s1//s2
数学 1.0 文综 NaN 理综 2.0 英语 1.0 语文 1.0 dtype: float64
s1.floordiv(s2,fill_value=1) #整除
数学 1.0 文综 0.0 理综 2.0 英语 1.0 语文 1.0 dtype: float64
s1%s2
数学 47.0 文综 NaN 理综 70.0 英语 37.0 语文 6.0 dtype: float64
s1.mod(s2,fill_value=0) # 取余
数学 47.0 文综 NaN 理综 70.0 英语 37.0 语文 6.0 dtype: float64
s2**s1
数学 8.425268e+301 文综 NaN 理综 inf 英语 9.157281e+307 语文 inf dtype: float64
s2.pow(s1,fill_value=0) # 次幂
数学 8.425268e+301 文综 1.000000e+00 理综 inf 英语 9.157281e+307 语文 inf dtype: float64
============================================
练习4:
根据以下考试成绩表,创建一个Dataframe,命名为df:
张三 李四 语文 150 0 数学 150 0 英语 150 0 理综 300 0
============================================
df=Dataframe({'张三':[150,150,150,300],'李四':[0,0,0,0]},index=['语文','数学','英语','理综'])
df
| 张三 | 李四 | |
|---|---|---|
| 语文 | 150 | 0 |
| 数学 | 150 | 0 |
| 英语 | 150 | 0 |
| 理综 | 300 | 0 |
df=pd.Dataframe({'张三':[150,150,150,300],'李四':[0,0,0,0]},index=['语文','数学','英语','理综'])
df
| 张三 | 李四 | |
|---|---|---|
| 语文 | 150 | 0 |
| 数学 | 150 | 0 |
| 英语 | 150 | 0 |
| 理综 | 300 | 0 |
============================================
练习5:
使用多种方法对ddd进行索引和切片,并比较其中的区别
============================================
# 通过列名取值
df.张三
语文 150 数学 150 英语 150 理综 300 Name: 张三, dtype: int64
df.李四
语文 0 数学 0 英语 0 理综 0 Name: 李四, dtype: int64
df['张三']
语文 150 数学 150 英语 150 理综 300 Name: 张三, dtype: int64
df[['张三','李四']]
| 张三 | 李四 | |
|---|---|---|
| 语文 | 150 | 0 |
| 数学 | 150 | 0 |
| 英语 | 150 | 0 |
| 理综 | 300 | 0 |
# 通过行名取值
df.loc['语文']
张三 150 李四 0 Name: 语文, dtype: int64
df.loc[['语文','数学']] # loc 全封闭,左闭右闭
| 张三 | 李四 | |
|---|---|---|
| 语文 | 150 | 0 |
| 数学 | 150 | 0 |
df.loc['语文':'理综']
| 张三 | 李四 | |
|---|---|---|
| 语文 | 150 | 0 |
| 数学 | 150 | 0 |
| 英语 | 150 | 0 |
| 理综 | 300 | 0 |
df.iloc[3]
张三 300 李四 0 Name: 理综, dtype: int64
df.iloc[0:4] # iloc里面必须是数字 iloc 半闭合,左闭右开
| 张三 | 李四 | |
|---|---|---|
| 语文 | 150 | 0 |
| 数学 | 150 | 0 |
| 英语 | 150 | 0 |
| 理综 | 300 | 0 |
df.iloc[0,1] # 第一行第二列的值
0
============================================
练习6:
-
假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。
-
假设张三期中考试数学被发现作弊,要记为0分,如何实现?
-
李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
-
后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?
============================================
ddd=pd.Dataframe(data=np.random.randint(90,150,size=(3,4)),index=['张三','李四','王五'],columns=['语文','英语','数学','python']) ddd
| 语文 | 英语 | 数学 | python | |
|---|---|---|---|---|
| 张三 | 141 | 144 | 102 | 127 |
| 李四 | 140 | 128 | 110 | 135 |
| 王五 | 102 | 93 | 92 | 135 |
ddd2=pd.Dataframe(data=np.random.randint(90,150,size=(4,5)),index=['张三','李四','王五','刘六'],columns=['语文','英语','数学','python','java']) ddd2
| 语文 | 英语 | 数学 | python | java | |
|---|---|---|---|---|---|
| 张三 | 94 | 90 | 115 | 141 | 113 |
| 李四 | 97 | 127 | 137 | 127 | 125 |
| 王五 | 144 | 123 | 104 | 105 | 101 |
| 刘六 | 109 | 104 | 129 | 112 | 147 |
- 假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。
ddd+ddd2
| java | python | 数学 | 英语 | 语文 | |
|---|---|---|---|---|---|
| 刘六 | NaN | NaN | NaN | NaN | NaN |
| 张三 | NaN | 268.0 | 217.0 | 234.0 | 235.0 |
| 李四 | NaN | 262.0 | 247.0 | 255.0 | 237.0 |
| 王五 | NaN | 240.0 | 196.0 | 216.0 | 246.0 |
sums=ddd.add(ddd2,fill_value=0) sums
| java | python | 数学 | 英语 | 语文 | |
|---|---|---|---|---|---|
| 刘六 | 147.0 | 112.0 | 129.0 | 104.0 | 109.0 |
| 张三 | 113.0 | 268.0 | 217.0 | 234.0 | 235.0 |
| 李四 | 125.0 | 262.0 | 247.0 | 255.0 | 237.0 |
| 王五 | 101.0 | 240.0 | 196.0 | 216.0 | 246.0 |
ddd.mean()
语文 127.666667 英语 121.666667 数学 101.333333 python 132.333333 dtype: float64
ddd2.mean()
语文 111.00 英语 111.00 数学 121.25 python 121.25 java 121.50 dtype: float64
sums.mean()
java 121.50 python 220.50 数学 197.25 英语 202.25 语文 206.75 dtype: float64
sums.mean(axis=0)
java 121.50 python 220.50 数学 197.25 英语 202.25 语文 206.75 dtype: float64
sums.mean(axis=1)
刘六 120.2 张三 213.4 李四 225.2 王五 199.8 dtype: float64
- 假设张三期中考试数学被发现作弊,要记为0分,如何实现?
ddd
| 语文 | 英语 | 数学 | python | |
|---|---|---|---|---|
| 张三 | 141 | 144 | 0 | 127 |
| 李四 | 240 | 228 | 210 | 235 |
| 王五 | 102 | 93 | 92 | 135 |
ddd.loc['张三','数学']=0
ddd
| 语文 | 英语 | 数学 | python | |
|---|---|---|---|---|
| 张三 | 141 | 144 | 0 | 127 |
| 李四 | 240 | 228 | 210 | 235 |
| 王五 | 102 | 93 | 92 | 135 |
- 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
ddd.loc['李四'] =ddd.loc['李四']+100 # 需要重新赋值
ddd
| 语文 | 英语 | 数学 | python | |
|---|---|---|---|---|
| 张三 | 141 | 144 | 0 | 127 |
| 李四 | 240 | 228 | 210 | 235 |
| 王五 | 102 | 93 | 92 | 135 |
ddd.loc['李四'].add(100.0) # 没有写入ddd中
语文 340.0 英语 328.0 数学 310.0 python 335.0 Name: 李四, dtype: float64
ddd
| 语文 | 英语 | 数学 | python | |
|---|---|---|---|---|
| 张三 | 141 | 144 | 0 | 127 |
| 李四 | 240 | 228 | 210 | 235 |
| 王五 | 102 | 93 | 92 | 135 |
- 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?
ddd
| 语文 | 英语 | 数学 | python | |
|---|---|---|---|---|
| 张三 | 141 | 144 | 0 | 127 |
| 李四 | 240 | 228 | 210 | 235 |
| 王五 | 102 | 93 | 92 | 135 |
ddd=ddd+10
ddd
| 语文 | 英语 | 数学 | python | |
|---|---|---|---|---|
| 张三 | 151 | 154 | 10 | 137 |
| 李四 | 250 | 238 | 220 | 245 |
| 王五 | 112 | 103 | 102 | 145 |



