Pandas
一个用于表示表格类型的内容
- 课时4:jupyter21 分22 秒
- 课时5:pandas的内容24 分31 秒
- 课时6:series内容38 分19 秒
- 课时7:dataframe25 分50 秒
# 载入pandas库
import pandas as pd
import numpy as np
s = pd.Series([2,4,6,8,10])
s
0     2
1     4
2     6
3     8
4    10
dtype: int64
d = pd.DataFrame([[2,4,6,8,10],[7,3,4,7,15],
])d
| 0 | 1 | 2 | 3 | 4 | |
|---|---|---|---|---|---|
| 0 | 2 | 4 | 6 | 8 | 10 | 
| 1 | 7 | 3 | 4 | 7 | 15 | 
d[0]
0    2
1    7
Name: 0, dtype: int64
这里要注意直接用中括号获取的是,列,因为比如我们要获取一个表中的age属性,通常的拿这age一列的数据出来,所以想要获取一条数据,需要再中括号一下
获取一行怎么获取
d.loc[0]
0     2
1     4
2     6
3     8
4    10
Name: 0, dtype: int64
这个给我们返回的是一个series
 实际上这个dataframe是由多个series组成的
 所以我们可以这么写
d2 = pd.DataFrame([pd.Series([2,4,6,8,10]),pd.Series([7,3,4,7,15]),
])
d2
| 0 | 1 | 2 | 3 | 4 | |
|---|---|---|---|---|---|
| 0 | 2 | 4 | 6 | 8 | 10 | 
| 1 | 7 | 3 | 4 | 7 | 15 | 
class1 = pd.Series({'hong': 50, 'huang': 90, 'qing': 60})# 修改字典索引
class1_values = {'hong': 50, 'huang': 90, 'qing': 60}
class1_index = ['hong', 'lv', 'lan']
# 这个地方的键是根据index参数设置的,然后前面的那个字典的键就不要了
class1 = pd.Series(class1_values, index=class1_index)
class1
hong    50.0
lv       NaN
lan      NaN
dtype: float64
class1# 值数据,输出类型为array,还是ndarray数组
class1.values# 索引,输出index类型(Pandas独有的索引类型),本质上就是ndarray
class1.indexclass1.index[2]
class1.index.valuesarray(['hong', 'lv', 'lan'], dtype=object)
class1_index
class1.hong50.0
class1[[1,2,0]]lv       NaN
lan      NaN
hong    50.0
dtype: float64
class1[0:1]
hong    50.0
dtype: float64
# 直接就能记性判断
class1 > 6
# 这个Nan值你怎么判断都是False
hong     True
lv      False
lan     False
dtype: bool
# 还能这样写
# 这种写法很类似于数据库的写法
class1[class1>6]
hong    50.0
dtype: float64
# 直接就全都加一
class1+1hong    51.0
lv       NaN
lan      NaN
dtype: float64
- 这种整体的加一,他是效率非常非常高的
- 如果是我们的列表,想要实现这个效果,那就得循环这个列表
 从列表中获取一个数据,把这个数据+1,放到新的列表中
- 而我们这个是将三条数据同时拿出来(就像并发一样),然后同时进行+1操作
 然后在同时放到一个新的里面.
- 我们可以通过那个运算时间的魔术命令来帮忙验证一下
%%timeit
# 修改字典索引
class2_values = [1024,3,5,7,9,10,13,115,127,149,221]
# 这个地方的键是根据index参数设置的,然后前面的那个字典的键就不要了
class2 = pd.Series(class2_values)
class2+1
198 µs ± 9.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit
class2+1
100 µs ± 3.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit
for i in range(100000):i+=1
4.12 ms ± 108 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
a = pd.Series(range(100000))
a+1562 µs ± 72 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
我猜可能是因为这个数据量不够大,还显示不出来这个库的优势,所以得多试试才行
 有的时候需要用GPU来计算,如果用CPU,会非常耗CPU,因为GPU更擅长这种小量的计算,他就相当于一堆小学生,这中加减乘除,小学生比CPU数学家更厉害
# 不仅能够进行加,减号,还能乘除,取余,底板除
print(class2 // 2) 
11.0
11.0
class2 = pd.Series([1024,3,5,7,9,10,13,115,127,149,221])
# 平均数
print(class2.mean())
print(np.mean(class2))
class2153.0
153.00     1024
1        3
2        5
3        7
4        9
5       10
6       13
7      115
8      127
9      149
10     221
dtype: int64
class3 = pd.Series([1024,13,5,7,9,10,1,115,127,149,221])
# 中位数
# 通过库中的函数调用
print(np.median(class3))
# 自身属性调用写法
print(class3.median())
# 中位数如果有两个数据,那就是这两个数据的平均数13.0
13.0
# 方差
class2.var()
89190.6
# 标准差
class2.std()298.6479532827908
print(class2)
print("-"*50)
print(class2+1)
print("-"*50)
# 全判断在不在容器中
# 这个容器包括类似于字典的键和值,都都算上,只有有都行,都算存在啊
print(10 in class2)
print("-"*50)
print(5 in class2 + 1)
# 浮点数运算不准的问题0     1024
1        3
2        5
3        7
4        9
5       10
6       13
7      115
8      127
9      149
10     221
dtype: int64
--------------------------------------------------
0     1025
1        4
2        6
3        8
4       10
5       11
6       14
7      116
8      128
9      150
10     222
dtype: int64
--------------------------------------------------
True
--------------------------------------------------
True
# 然后问我们可以取出来values
print(4 in class2) 
print(4 in class2.values)
True
False
# values值修改
class2['ming'] = 0
class2['hua'] = 0
class2['hong'] = 0class2[['hua','hong']] = 55
class2[['hua','hong']] = [35, 55]
class2['hua','hong'] = [1, 2]  # 一层也可以
class20       1024
1          3
2          5
3          7
4          9
5         10
6         13
7        115
8        127
9        149
10       221
ming       0
hua        1
hong       2
dtype: int64
# 深拷贝
class4 = class2.copy()
class4 = class4+1
print(class2)
class4
0       1024
1          3
2          5
3          7
4          9
5         10
6         13
7        115
8        127
9        149
10       221
ming       0
hua        1
hong       2
dtype: int640       1025
1          4
2          6
3          8
4         10
5         11
6         14
7        116
8        128
9        150
10       222
ming       1
hua        2
hong       3
dtype: int64
# 索引也可以单独的进行修改
class2.index = [22,23,24,28,24,29,1,2,3,4,8,5,9,21]
class2
22    1024
23       3
24       5
28       7
24       9
29      10
1       13
2      115
3      127
4      149
8      221
5        0
9        1
21       2
dtype: int64
# 这个csv路径不能有中文,否则获取失败
df = pd.read_csv("./source/test.csv")
df| ro | c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c9 | c10 | c11 | c12 | c13 | c14 | c15 | c16 | c17 | c18 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | a | 0 | 5 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 
| 1 | b | 1 | 6 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 
| 2 | c | 2 | 7 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 
| 3 | d | 3 | 8 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 
| 4 | e | 4 | 9 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 
csv中的数据都是用逗号隔开的,出自:
 python:pandas——read_csv方法