(2) python--pandas
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
import pandas as pdimport numpy as np# 创建的Series几种方式s1 = pd.Series(range(4))s2 = pd.Series([0, 1, 2, 3])s3 = pd.Series(np.arange(4))print(s1)'''0 01 12 23 3dtype: int64'''print(s2)'''0 01 12 23 3dtype: int64'''print(s3)'''0 01 12 23 3dtype: int32'''# 之前在numpy中说过Series相当于给array加上了index。如果不定义index那么默认为0,1,2····s4 = pd.Series(["satori", "mashiro", "nagisa", "sora"], index=["东方地灵殿", "樱花庄的宠物女孩", "clannad", "缘之空"])print(s4)'''东方地灵殿 satori樱花庄的宠物女孩 mashiroclannad nagisa缘之空 soradtype: object'''# 并且索引还可以重复s5 = pd.Series(["satori", "tomoyo", "mashiro", "nagisa", "sora"], index=["东方地灵殿", "clannad", "樱花庄的宠物女孩", "clannad", "缘之空"])print(s5)'''东方地灵殿 satoriclannad tomoyo樱花庄的宠物女孩 mashiroclannad nagisa缘之空 soradtype: object'''print(s5["clannad"])'''clannad tomoyoclannad nagisadtype: object'''# 即便定义了index仍然可以通过索引来获取print(s5[0]) # satoriprint(s5[1]) # tomoyoprint(s5[2]) # mashiroprint(s5[3]) # nagisaprint(s5[4]) # sora |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
import pandas as pdimport numpy as np# DataFrame相当于二维的Series,行索引为0,1,2····,列索引如果不指定也为0,1,2····df = pd.DataFrame(np.arange(12).reshape(3, 4))print(df)''' 0 1 2 30 0 1 2 31 4 5 6 72 8 9 10 11'''# head,接收一个整型,表示打印前多少行的数据# tail,接收一个整型,表示打印后多少行的数据print(df.head(2))''' 0 1 2 30 0 1 2 31 4 5 6 7'''print(df.tail(2))''' 0 1 2 31 4 5 6 72 8 9 10 11'''# -------------------------------df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=["A", "B", "C", "D"])print(df)''' A B C D0 0 1 2 31 4 5 6 72 8 9 10 11'''# 通过索引或者切片获取元素# 如果直接使用df的话,那么不能通过df[,]的方式,只能df[][],df[]找到对应的列(注意是列),df[][]再找到当前列的某个值print(df["A"][1]) # 4# 如果我一定要通过df[,]的方式呢?# 有以下几种方式# iloc,一定要传入索引。行就不必说了,列虽然我们指定了名字,但仍然可以通过索引来传值。A的索引是0,B的索引是1·····,当然这里还是按照行和列的顺序的print(df.iloc[0, 1]) # 1# iloc是通过索引传的,如果我想用值传呢?使用loc,而且loc只能传值。行的索引和值都相同,但列必须穿指定的indexprint(df.loc[0, "B"]) # 1# at,同样需要传入值print(df.at[0, "B"]) # 1# ix,既可以传值,又可以传索引。但是貌似要被移除了,提示使用iloc或者loc。print(df.ix[0, "B"], df.ix[0, 1]) # 1 1# 数据的形状print(df.shape) # (3, 4)# 数据的类型print(df.dtypes)'''A int32B int32C int32D int32dtype: object'''# 数组的维度print(df.ndim) # 2,表明两行四列,维度是2# 数组元素的个数print(df.size) # 12# 数组的索引print(df.index) # RangeIndex(start=0, stop=3, step=1)# 数组的列名print(df.columns) # Index(['A', 'B', 'C', 'D'], dtype='object')# 数组的值,打印的是一个arrayprint(df.values)'''[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]'''# 整体信息描述print(df.describe())''' A B C Dcount 3.0 3.0 3.0 3.0mean 4.0 5.0 6.0 7.0std 4.0 4.0 4.0 4.0min 0.0 1.0 2.0 3.025% 2.0 3.0 4.0 5.050% 4.0 5.0 6.0 7.075% 6.0 7.0 8.0 9.0max 8.0 9.0 10.0 11.0''' |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
import pandas as pd# 关于pandas如何读取文件# pd.read_sql(sql, conn) # 读取数据库里的文件,sql为查询的函数,conn则为数据库驱动的connect,或者SQLAlchemy的create_engine()创建的一个引擎# pd.read_csv(),用来处理CSV文件 # 这里面的参数非常多,介绍几个常用的 # 第一个参数:一定要传文件路径或者buf。后面的参数,传入的时候最好加上参数名 # 第二个参数:sep,表示用什么分割,不指定的话默认用空格 # 第三个参数:usecols,如果csv文件中有很多列,而我们只需要某几个,这个时候就可以使用usecols,将需要筛选的列作为列表传给usecols # 第四个参数:nrows,有的时候我们不一样要全部读到内存中,所有nrows指定读取的行数 # 第五个参数:index_col,将内容读到DataFrame的时候,选择哪一列作为索引。 # 第六个参数:encoding,选择编码,除了文件路径# pd.read_excel(),用来处理Excel文件 # 参数依旧有很多,想介绍的和read_csv()差不多 # 第一个参数:文件名路径 # 第二个参数:sheetname # 后面的参数和read_csv()类似# pd.read_table(),用来处理TXT文件 # 参数有很多,和read_csv()传参一样,# 这里介绍处理CSV,其实主要还是把内容读成DataFrame之后的操作,从这个角度来说,读取什么文件不重要,重要的是在读取之后如何进行操作df = pd.read_csv(r"C:\Users\Administrator\Desktop\satori.csv", encoding="gbk")print(df)# 可以看到文件全部读进来了''' 姓名 年龄 登场作品 性别 发色0 古明地觉 16 东方地灵殿 女 紫红1 椎名真白 17 樱花庄的宠物女孩 女 金色2 宫园薰 16 四月是你的谎言 女 金色3 春日野穹 15 缘之空 女 银白4 古河渚 18 clannad 女 棕色5 坂上智代 17 clannad 女 银白6 雨宫优子 16 悠久之翼 女 黑色7 四方茉莉 17 sola 女 黑色'''# ---------------------------'''# 测试nrowsdf = pd.read_csv(r"C:\\Users\Administrator\Desktop\satori.csv", encoding="gbk", nrows=3)print(df)# 可以看到我们只读了三行 姓名 年龄 登场作品 性别 发色0 古明地觉 16 东方地灵殿 女 紫红1 椎名真白 17 樱花庄的宠物女孩 女 金色2 宫园薰 16 四月是你的谎言 女 金色'''# ------'''# 测试usecols,注意这里的usecols还可以用对应的索引代替,从零开始慢慢数。df = pd.read_csv(r"C:\\Users\Administrator\Desktop\satori.csv", encoding="gbk", nrows=3, usecols=["姓名", "发色"])print(df)# 可以看到在读取了三行的基础上,只读了两列 姓名 发色0 古明地觉 紫红1 椎名真白 金色2 宫园薰 金色'''# --------# 现在df长这个样子print(df)''' 姓名 年龄 登场作品 性别 发色0 古明地觉 16 东方地灵殿 女 紫红1 椎名真白 17 樱花庄的宠物女孩 女 金色2 宫园薰 16 四月是你的谎言 女 金色3 春日野穹 15 缘之空 女 银白4 古河渚 18 clannad 女 棕色5 坂上智代 17 clannad 女 银白6 雨宫优子 16 悠久之翼 女 黑色7 四方茉莉 17 sola 女 黑色'''# 筛选出年龄大于16的print(df[df["年龄"] > 16])''' 姓名 年龄 登场作品 性别 发色1 椎名真白 17 樱花庄的宠物女孩 女 金色4 古河渚 18 clannad 女 棕色5 坂上智代 17 clannad 女 银白7 四方茉莉 17 sola 女 黑色'''# 将每个人的年龄减去一df["年龄"] = df["年龄"].apply(lambda x: x-1)print(df)''' 姓名 年龄 登场作品 性别 发色0 古明地觉 15 东方地灵殿 女 紫红1 椎名真白 16 樱花庄的宠物女孩 女 金色2 宫园薰 15 四月是你的谎言 女 金色3 春日野穹 14 缘之空 女 银白4 古河渚 17 clannad 女 棕色5 坂上智代 16 clannad 女 银白6 雨宫优子 15 悠久之翼 女 黑色7 四方茉莉 16 sola 女 黑色'''# ---------------'''# 假设df当中存在名为"时间"的时间戳,怎么转化为我们看着舒服的日期呢?df["时间"] = pd.to_datetime(df["时间"], format="%Y-%d-%m", errors="coerce")'''# 查找姓名中包含宫的print(df[df["姓名"].str.contains("宫")])''' 姓名 年龄 登场作品 性别 发色2 宫园薰 15 四月是你的谎言 女 金色6 雨宫优子 15 悠久之翼 女 黑色'''# 查找年龄为14或者16的print(df[df["年龄"].isin([14, 16])])''' 姓名 年龄 登场作品 性别 发色1 椎名真白 16 樱花庄的宠物女孩 女 金色3 春日野穹 14 缘之空 女 银白5 坂上智代 16 clannad 女 银白7 四方茉莉 16 sola 女 黑色'''# 将DataFrame按照年龄排序,如果按照多个列排序,那么将多个列组成一个列表传进去# 参数里面还有一个ascending=True,表示正序排,inplace=False,表示不在原来的DataFrame上操作,而是返回一个新的DataFrameprint(df.sort_values(by="年龄"))''' 姓名 年龄 登场作品 性别 发色3 春日野穹 14 缘之空 女 银白0 古明地觉 15 东方地灵殿 女 紫红2 宫园薰 15 四月是你的谎言 女 金色6 雨宫优子 15 悠久之翼 女 黑色1 椎名真白 16 樱花庄的宠物女孩 女 金色5 坂上智代 16 clannad 女 银白7 四方茉莉 16 sola 女 黑色4 古河渚 17 clannad 女 棕色'''# 计算不同年龄的出现的次数print(df["年龄"].value_counts())'''15 316 314 117 1Name: 年龄, dtype: int64'''print(type(df["年龄"].value_counts())) # <class 'pandas.core.series.Series'># groupby汇总,如果按照多列汇总,那么将多列组合成一个列表传进去# 里面的as_index,默认为True,说明汇总之后,传给by的列名要作为索引,如果多个列,那么共同作为索引# 里面的sort=True,表示汇总之后自动排序# 按照发色汇总,count表示每一种发色总共对应多少个nameprint(df[["姓名", "发色"]].groupby(by="发色").count())''' 姓名发色 棕色 1紫红 1金色 2银白 2黑色 2'''# 除了count还有sum,比方我想按照"发色"汇总年龄,把发色相同的人的年龄加在一起print(df[["年龄", "发色"]].groupby(by="发色").sum())''' 年龄发色 棕色 17紫红 15金色 31银白 30黑色 31'''# 我想把年龄相同的过滤掉# inplace=False,默认不在原表上进行操作,而是返回新的列表。keep="first",表示去重的时候保留第一个,也可以指定为last# 按照多个值过滤,组个列表传进去print(df.drop_duplicates("年龄"))''' 姓名 年龄 登场作品 性别 发色0 古明地觉 15 东方地灵殿 女 紫红1 椎名真白 16 樱花庄的宠物女孩 女 金色3 春日野穹 14 缘之空 女 银白4 古河渚 17 clannad 女 棕色'''# 数据的合并# 首先是concat,默认是上下合并,里面接受一个列表,列表可以存放很多个df,默认是axis=0,上下合并print(pd.concat([df, df]))'''0 古明地觉 15 东方地灵殿 女 紫红1 椎名真白 16 樱花庄的宠物女孩 女 金色2 宫园薰 15 四月是你的谎言 女 金色3 春日野穹 14 缘之空 女 银白4 古河渚 17 clannad 女 棕色5 坂上智代 16 clannad 女 银白6 雨宫优子 15 悠久之翼 女 黑色7 四方茉莉 16 sola 女 黑色'''# 左右合并print(pd.concat([df, df], axis=1))''' 姓名 年龄 登场作品 性别 发色 姓名 年龄 登场作品 性别 发色0 古明地觉 15 东方地灵殿 女 紫红 古明地觉 15 东方地灵殿 女 紫红1 椎名真白 16 樱花庄的宠物女孩 女 金色 椎名真白 16 樱花庄的宠物女孩 女 金色2 宫园薰 15 四月是你的谎言 女 金色 宫园薰 15 四月是你的谎言 女 金色3 春日野穹 14 缘之空 女 银白 春日野穹 14 缘之空 女 银白4 古河渚 17 clannad 女 棕色 古河渚 17 clannad 女 棕色5 坂上智代 16 clannad 女 银白 坂上智代 16 clannad 女 银白6 雨宫优子 15 悠久之翼 女 黑色 雨宫优子 15 悠久之翼 女 黑色7 四方茉莉 16 sola 女 黑色 四方茉莉 16 sola 女 黑色'''# 采用merge方式合并# merge里面只接收两个df,然后是合并方式,how="left",按照左边的df合并,如果左边的df中没有就丢弃,同理right类似。how="inner",两个df相当于做交集。how="outer",两个df相当于做补集# on = "",表示按照哪个字段合并,如果多个字段作为列表传进去print(pd.merge(df, df, how="outer", on="姓名"))''' 姓名 年龄_x 登场作品_x 性别_x 发色_x 年龄_y 登场作品_y 性别_y 发色_y0 古明地觉 15 东方地灵殿 女 紫红 15 东方地灵殿 女 紫红1 椎名真白 16 樱花庄的宠物女孩 女 金色 16 樱花庄的宠物女孩 女 金色2 宫园薰 15 四月是你的谎言 女 金色 15 四月是你的谎言 女 金色3 春日野穹 14 缘之空 女 银白 14 缘之空 女 银白4 古河渚 17 clannad 女 棕色 17 clannad 女 棕色5 坂上智代 16 clannad 女 银白 16 clannad 女 银白6 雨宫优子 15 悠久之翼 女 黑色 15 悠久之翼 女 黑色7 四方茉莉 16 sola 女 黑色 16 sola 女 黑色''' |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
'''df[pd.isnull(df.title)],选出title为空的所有行df[df.title.contains("aaa", na=False)], 选出title包含aaa的所有行,不包括空值 a0 101 302 503 704 905 100labels = ["10到20", "20到40","40到60","60到80", "80到95", "100"]bins = [20, 40, 60, 80, 95, 100]pd.cut(df.a, bins, right=True, labels=None)>>> a0 (1, 20]1 (20, 40]2 (40,60]3 (60, 80]4 (80, 95]5 (95, 100]pd.cut(df.a, bins, right=True, labels=labels)>>> a0 10到201 20到402 40到603 60到804 80到955 100字符串专程日期格式df.to_datetime(df.time, format="")日期抽取df["time"].dt.yeardf["time"].dt.monthdf["time"].dt.daydf["time"].dt.hourdf["time"].dt.minutedf["time"].dt.seconddf["time"].dt.weekday''' |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
df = pd.DataFrame({"a": [4,3,4,5], "b": [5,2,7,7], "c": [4,4,8,9]})print(df.div(100))''' a b c0 0.04 0.05 0.041 0.03 0.02 0.042 0.04 0.07 0.083 0.05 0.07 0.09'''# 表示先对每一行进行求和,让列元素分别去除print(df.div(df.sum(axis=1), axis=0))# 会发现每一行相加等于一''' a b c0 0.307692 0.384615 0.3076921 0.333333 0.222222 0.4444442 0.210526 0.368421 0.4210533 0.238095 0.333333 0.428571'''# 表示先对每一列进行求和,让行元素分别去除# 会发现每一列相加等于一print(df.div(df.sum(axis=0), axis=1))''' a b c0 0.2500 0.238095 0.161 0.1875 0.095238 0.162 0.2500 0.333333 0.323 0.3125 0.333333 0.36'''# 查看相关性'''df["a"].corr(df["b"]), 查看a和b之间的相关性df["a", "b", "c"].corr(df["a", "b"]), 查看a,b,c和a,b之间的相关性,a、b和a、b之间肯定高度相关df["a", "b", "c"].corr(),corr不加参数默认和前面的df保持一致,即查看a、b、c和a、b、c之间的相关性''' |
|
1
2
|
pd.set_option("expand_frame_repr", False) # 列太多时不换行pd.set_option("max_colwidth", 8) # 有的列太长,我们可以进行设置,比如设置最大列宽等于8 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
''' alpha0 a1 b2 c3 d4 edf["new_alpha"] = df["alpha"].shift(1)那么df["new_data"]会在df["alpha"]的基础上上移1位,超出的部分为NaN,里面的可以为任意数字。如果为负数,那么在原来的基础上下移 alpha new_alpha0 a NaN1 b a2 c b3 d c4 e d''' |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
''' 收盘价0 101 122 93 114 13df["涨跌] = df["收盘价"].diff(-1),求本行数据和上行数据相减的结果。为1,则是上行数据和本行数据相减的结果。如果-2,则是本上数据和上两行数据相减的结果 收盘价 涨跌0 10 2 -->12-101 12 -3-->9-122 9 2 -->11-93 11 2 -->13-114 13 NaN -->NaN-13''' |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
''' 收盘价0 101 122 93 114 13df["涨跌] = df["收盘价"].pct_change(-1), 类似于diff,但求的是增加或者减少的比例 收盘价 涨跌0 10 (12-10)/21 12 (9-12)/122 9 (11-9)/93 11 (13-11)/114 13 NaN''' |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
''' 收盘价0 101 122 93 114 13df["收盘价_cum"] = df["收盘价"].cumsum() ,累加 收盘价 收盘价_cum0 10 101 12 12+102 9 9+12+103 11 11+9+12+104 13 13+11+9+12+10还有cumprod表示累乘''' |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
''' 收盘价0 101 122 93 114 13df["收盘价排序"] = df["收盘价"].rank(ascending=True, pct=False) 收盘价 收盘价排序0 10 2 从小到大排名第21 12 4 从小到大排名第42 9 1 从小到大排名第13 11 3 从小到大排名第34 13 5 从小到大排名第5ascending:升序,为True表示从小到大,为False从大到小pct:percent,为False表示排名,为True表示排名的百分比''' |
|
1
2
3
4
5
6
|
'''df.dropna(how="any"),只要有空值就删df.dropna(how="all"),必须全为空值才删df.drop(subset=["column1", "column2"], how="all"),其他列不管,只要column1、columns2全为空值就删除这一行。''' |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
''' 收盘价 利润0 10 201 12 152 9 NaN3 11 134 13 NaNdf["利润"] = df["利润"].fillna(value=10) 收盘价 利润0 10 201 12 152 9 103 11 134 13 10df["利润"] = df["利润"].fillna(value=df["收盘价"]) 收盘价 利润0 10 201 12 152 9 93 11 134 13 13df["利润"] = df["利润"].fillna(method="ffill"),向上寻找最近的一个非空值进行填充 收盘价 利润0 10 201 12 152 9 153 11 134 13 13同理method="bfill",表示向下寻找一个最近的非空值进行填充 收盘价 利润0 10 201 12 152 9 NaN3 11 134 13 NaNdf.notnull(),判断是不是不空值,不空为True, 空为Falsedf.isnull(),判断是不是空值,空为True, 不空为Falsedf[df["利润"].isnull()] 收盘价 利润2 9 NaN4 13 NaNdf[df["利润"].notnull()] 收盘价 利润0 10 201 12 153 11 13''' |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import pandas as pddf = pd.DataFrame({"a": [0, 1, 2, 3, 4], "b": [5, 6, 7, 8, 9]})print(df)''' a b0 0 51 1 62 2 73 3 84 4 9'''print(df.rolling(3).mean())''' a b0 NaN NaN1 NaN NaN2 1.0 6.03 2.0 7.04 3.0 8.0'''print(df.rolling(3, min_periods=1).mean())''' a b0 0.0 5.01 0.5 5.52 1.0 6.03 2.0 7.04 3.0 8.0'''print(df.expanding().mean())''' a b0 0.0 5.01 0.5 5.52 1.0 6.03 1.5 6.54 2.0 7.0前n行的平均数''' |

浙公网安备 33010602011771号