常用的两个类 Series 一维 DataFrame 二维
Series 一种类似于数组的对象,由两部分组成:
- values: 一组数据 (ndarray类型)
- index: 相关的数据索引标签
Series 的创建
- 由列表或numpy数组创建
- 由字典创建
Series(data=[1,2,3]) # 必须是一维结构 index 默认 0,1,2
0 1
1 2
2 3
dtype: int64
s = Series(data=[1,2,3],index=['q','w','e']) # 必须是一维结构
q 1
w 2
e 3
dtype: int64
Series 索引和切片
print(s[0])
1
print(s['q'])
1
print(s.w)
2
print(s[[1,2]]) # 访问 1 2 两个元素
w 2
e 3
# 切片
print(s[0:1])
q 1
dtype: int64
print(s['q':"w"])
q 1
w 2
dtype: int64
常用属性
print(s.shape) # 形状
(3,)
print(s.size) # 大小
3
print(s.index) # 索引 有显示 没有默认索引
Index(['q', 'w', 'e'], dtype='object')
print(s.values) # value值
[1 2 3]
常用的方法
# 常用的方法
print(s.head(3)) # 前几个元素
0 1
1 2
2 3
dtype: int64
print(s.tail(3)) # 后几个元素
0 1
1 2
2 3
dtype: int64
s1 = Series(data=[1,1,2,2,3,3,4])
print(s1.unique()) # 元素去重
[1 2 3 4]
print(s1.nunique()) # 元素去重后的个数
4
print(s1.isnull()) # 检测元素是否为空
0 False
1 False
2 False
3 False
4 False
5 False
6 False
dtype: bool
print(s1.notnull()) # 检测元素是否为非空
0 True
1 True
2 True
3 True
4 True
5 True
6 True
dtype: bool
算术运算
s = Series(data=[1,2,3],index=['a','b','c'])
s1 = Series(data=[1,2,3],index=['a','d','c'])
s2 = s+s1
a 2.0
b NaN
c 6.0
d NaN
dtype: float64
DataFrame 是一个【表格型】的数据结构,DataFrame由按照一定顺序排列的多列数据组成。设计初衷就是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
-行索引:index
-列索引: columns
- 值: values
创建
ret = DataFrame(data=[[1, 2, 3], [4, 5, 6]])
0 1 2
0 1 2 3
1 4 5 6
dic = {"name": ["wz", "tp", "qq"], "salary": [100, 200, 300]}
ret1 = DataFrame(data=dic)
name salary
0 wz 100
1 tp 200
2 qq 300
DataFrame(data=(np.ones(shape=(3, 2))), index=['a', 'b', 'c'], columns=["A", "B"])
A B
a 1.0 1.0
b 1.0 1.0
c 1.0 1.0
DataFrame 常用的属性
ret= DataFrame(data=(np.ones(shape=(3, 2))), index=['a', 'b', 'c'], columns=["A", "B"])
print(ret.shape) # 形状
(3, 2)
print(ret.values) # 元素值
[[1. 1.]
[1. 1.]
[1. 1.]]
print(ret.index) # 行索引
Index(['a', 'b', 'c'], dtype='object')
print(ret.columns) # 列索引
Index(['A', 'B'], dtype='object')
索引取值
- iloc 通过隐式索引取行
- loc 通过显示索引取行
A B C D
a 27 4 91 80
b 9 64 14 10
c 89 19 58 60
d 9 45 32 93
e 66 41 5 34
Name: A, dtype: int64
print(ret['A']) # == ret.A 显示索引取列
a 27
b 9
c 89
d 9
e 66
Name: A, dtype: int64
print(ret.iloc[:, 0]) # 隐示索引取列
a 27
b 9
c 89
d 9
e 66
Name: A, dtype: int64
# 取行
print(ret.loc['a']) # 显示索引取行
A 27
B 4
C 91
D 80
Name: a, dtype: int64
print(ret.iloc[0]) # 隐示索引取行
A 27
B 4
C 91
D 80
Name: a, dtype: int64
# 取元素
print(ret.loc["b","B"]) # 显示索引取元素
64
print(ret.iloc[1,1]) # 隐式索引取元素
64
print(ret.iloc[[1,2],1]) # 取 第一二行的第一列 从0 开始
b 64
c 19
Name: B, dtype: int64
切片
A B C D
a 42 35 57 56
b 80 42 85 49
c 97 97 59 12
d 20 30 24 28
e 26 27 42 28
print(ret.iloc[:, 0:2]) # 通过隐式索引 取列
A B
a 42 35
b 80 42
c 97 97
d 20 30
e 26 27
print(ret.loc[:, "A":"B"]) # 通过显示式索引 取列
A B
a 42 35
b 80 42
c 97 97
d 20 30
e 26 27
print(ret[0:2]) # 取前两行
A B C D
a 42 35 57 56
b 80 42 85 49
切片索引总结
索引
- ret[col] 取列
- ret.loc[index] 取行
- ret.iloc[:,col1,col3] 取列
切片 - ret[index1:index3] 切行
- ret.iloc[:,col1:col3] 切列
处理空值 之 删除所在行
ret = DataFrame(data=(np.random.randint(0, 100, size=(5, 4))), index=['a', 'b', 'c', 'd', 'e'],
columns=["A", "B", "C", "D"])
A B C D
a 76 27 24 52
b 5 99 95 26
c 35 33 4 57
d 45 81 47 88
e 92 43 21 79
# 手动置空数据
ret.iloc[2, 3] = None
ret.iloc[4, 1] = None
ret.iloc[1, 2] = None
A B C D
a 76 27.0 24.0 52.0
b 5 99.0 NaN 26.0
c 35 33.0 4.0 NaN
d 45 81.0 47.0 88.0
e 92 NaN 21.0 79.0
# 将空值行 删除
# isnull notnull 检测元素是否为空值 notnull + all连用 isnull + any 连用
# any all 检测行列中是否有空值 axis = 0 列 axis = 1 行
index= ret.notnull().all(axis=1) # 把True False 当做行索引
ret.loc[index]
A B C D
a 76 27.0 24.0 52.0
d 45 81.0 47.0 88.0
# isnull notnull 检测元素是否为空值 notnull+ all连用 isnull + any 连用
index= ret.isnull().any(axis=1) # 把True False 当做行索引
print(ret.loc[-index]) # 索引取反 结果相同
print(ret.loc[~index]) # 取反 减号和波浪线都可以取反
A B C D
a 76 27.0 24.0 52.0
d 45 81.0 47.0 88.0
# drop开头函数 行 和列 和以前不同
ret1 = ret.dropna(axis=1) # 删除列
A
a 80
b 69
c 34
d 75
e 55
ret2 = ret.dropna(axis=0) # 删除行
A B C D
a 80 13.0 56.0 25.0
d 75 20.0 0.0 68.0
处理空值 之 填充空值
# 将空值 赋值
print(ret.fillna(value=0)) # 把空按照指定数据填充
A B C D
a 46 38.0 56.0 89.0
b 60 70.0 NaN 7.0
c 66 43.0 49.0 NaN
d 9 65.0 27.0 91.0
e 66 NaN 42.0 87.0
(ret.fillna(method="bfill",axis=1) # 列向上填充 行向左填充 1 是行
A B C D
a 38.0 52.0 59.0 52.0
b 7.0 58.0 20.0 20.0
c 63.0 99.0 81.0 NaN
d 4.0 71.0 1.0 49.0
e 33.0 24.0 24.0 36.0
print(ret.fillna(method="ffill", axis=1)) # 列向下填充 行向右填充 0 是列
A B C D
a 46.0 38.0 56.0 89.0
b 60.0 70.0 70.0 7.0
c 66.0 43.0 49.0 49.0
d 9.0 65.0 27.0 91.0
e 66.0 66.0 42.0 87.0
处理重复的行数据
ret.iloc[1]=[6,6,6,6]
ret.iloc[3]=[6,6,6,6]
ret.iloc[4]=[6,6,6,6]
A B C D
a 94 8 63 16
b 6 6 6 6
c 62 99 25 48
d 6 6 6 6
e 6 6 6 6
# print(ret.drop_duplicates(keep="first")) # 保留第一行
A B C D
a 94 8 63 16
b 6 6 6 6
c 62 99 25 48
# print(ret.drop_duplicates(keep="last")) # 保留最后一行
处理异常数据
# 去除两倍方差的c列数据 超过两倍方差视为异常数据
ret = DataFrame(data=(np.random.random(size=(100, 3))), columns=['a', 'b', 'c'])
twice_std = ret['c'].std()*2
0.5856121546838708
print(ret.loc[-(ret['c']>twice_std)])
a b c
0 0.098410 0.980701 0.229913
1 0.708112 0.053732 0.088544
3 0.426246 0.397871 0.458650
4 0.755058 0.883988 0.363447
5 0.821865 0.757735 0.345691
6 0.933166 0.553347 0.003675
7 0.861295 0.944037 0.205257
8 0.123134 0.064870 0.290891
9 0.961845 0.161606 0.040938
10 0.504057 0.900849 0.151937
13 0.598321 0.458578 0.446986
14 0.668289 0.001346 0.526895
15 0.851928 0.787721 0.029239
......
89 0.929992 0.881826 0.538839
90 0.392941 0.415403 0.339590
91 0.605760 0.114224 0.577329
92 0.145157 0.638680 0.211028
94 0.667892 0.608546 0.305324
95 0.807824 0.104220 0.049012
96 0.212302 0.287099 0.058159
98 0.085008 0.625935 0.082952
99 0.970903 0.255317 0.171248
级联操作
from pandas import Series, DataFrame
import pandas as pd
ret = DataFrame(data=np.random.randint(0, 100, size=(4, 3)), columns=["a", "b", "c"])
a b c
0 68 43 64
1 97 23 56
2 40 45 17
3 2 96 25
ret1 = DataFrame(data=np.random.randint(0, 100, size=(4, 3)), columns=["a", "b", "c"])
a b c
0 59 76 7
1 28 83 76
2 7 98 97
3 4 15 46
# 匹配级联
rr = pd.concat((ret,ret1),axis=1) # axis=1 横向 axis=0 纵向
a b c a b c
0 68 43 64 59 76 7
1 97 23 56 28 83 76
2 40 45 17 7 98 97
3 2 96 25 4 15 46
#不匹配级联
ret = DataFrame(data=np.random.randint(0, 100, size=(4, 3)), columns=["a", "b", "c"])
a b c
0 49 8 22
1 99 36 54
2 74 9 84
3 88 32 73
ret1 = DataFrame(data=np.random.randint(0, 100, size=(4, 3)), columns=["a", "d", "c"])
a d c
0 68 90 25
1 22 94 16
2 3 96 47
3 25 84 62
# 匹配级联
# rr = pd.concat((ret, ret1), axis=0,join="inner") # axis=1 横向 axis=0 纵向 inner 不匹配的删除
a c
0 42 21
1 3 88
2 40 78
3 1 98
0 66 73
1 11 53
2 0 76
3 58 79
rr = pd.concat((ret, ret1), axis=0,join="outer") # axis=1 横向 axis=0 纵向 outer 保留不匹配的
a b c d
0 49 8.0 22 NaN
1 99 36.0 54 NaN
2 74 9.0 84 NaN
3 88 32.0 73 NaN
0 68 NaN 25 90.0
1 22 NaN 16 94.0
2 3 NaN 47 96.0
3 25 NaN 62 84.0
ll = ret.append(ret1) # 只能列与列级联 不能进行行级联 一般很少用
ret
employee group
0 wz AAA
1 tp EEE
2 qq FFF
employee hire_date
ret1
0 wz 111
1 tp 222
2 qq 333
employee group hire_date
0 wz AAA NaN
1 tp EEE NaN
2 qq FFF NaN
0 wz NaN 111
1 tp NaN 222
2 qq NaN 333
合并操作
dic = {"employee": ["wz", "tp", 'qq'], "group": ["AAA", "EEE", "FFF"]}
dic1 = {"employee": ["wz", "tp", 'qq'], "hire_date": ["111", "222", "333"]}
ret = DataFrame(data=dic)
employee group
0 wz AAA
1 tp EEE
2 qq FFF
ret1 = DataFrame(data=dic1)
employee hire_date
0 wz 111
1 tp 222
2 qq 333
pd.merge(ret,ret1,on="employee") # 只能合并两张表 on=""合并条件 不写on 默认按两张表共有的列合并
employee group hire_date
0 wz AAA 111
1 tp EEE 222
2 qq FFF 333
dic = {"employee": ["wz", "tp"], "group": ["AAA", "EEE"], "hire_data1": [2004, 2006]}
dic1 = {"employee": ["wz", "tp", 'qq', "tp"], "hire_date": ["111", "222", "333", "444"]}
ret = DataFrame(data=dic)
employee group hire_data1
0 wz AAA 2004
1 tp EEE 2006
ret1 = DataFrame(data=dic1)
employee hire_date
0 wz 111
1 tp 222
2 qq 333
3 tp 444
ll = pd.merge(ret, ret1, how="outer") # outer 保留差异项 不写默认是 inner
employee group hire_data1 hire_date
0 wz AAA 2004.0 111
1 tp EEE 2006.0 222
2 tp EEE 2006.0 444
3 qq NaN NaN 333
ll = pd.merge(ret, ret1) # 默认 how="inner"
employee group hire_data1 hire_date
0 wz AAA 2004 111
1 tp EEE 2006 222
2 tp EEE 2006 444
ll = pd.merge(ret, ret1, how="right") # 保留右表数据
employee group hire_data1 hire_date
0 wz AAA 2004.0 111
1 tp EEE 2006.0 222
2 tp EEE 2006.0 444
3 qq NaN NaN 333’
ll = pd.merge(ret, ret1, how="left") # 保留左表数据
employee group hire_data1 hire_date
0 wz AAA 2004 111
1 tp EEE 2006 222
2 tp EEE 2006 444
dic = {"name": ["wz", "tp", "sb"], "group": ["AAA", "EEE", "eee"], "hire_data1": [2004, 2006, 2020]}
dic1 = {"employee": ["wz", "tp", 'qq', "tp"], "hire_date": ["111", "222", "333", "444"]}
ret = DataFrame(data=dic)
name group hire_data1
0 wz AAA 2004
1 tp EEE 2006
2 sb eee 2020
ret1 = DataFrame(data=dic1)
employee hire_date
0 wz 111
1 tp 222
2 qq 333
3 tp 444
ll = pd.merge(ret, ret1, left_on="name",right_on="employee",how="outer") # 列名不同 需要指定左右表的合并条件
name group hire_data1 employee hire_date
0 wz AAA 2004.0 wz 111
1 tp EEE 2006.0 tp 222
2 tp EEE 2006.0 tp 444
3 sb eee 2020.0 NaN NaN
4 NaN NaN NaN qq 333
网友评论