, y, L4 |8 U2 m3 D* l9 d; N ; I7 q8 q! q7 T) Q8 x: Z+ A0 v0 O# R% B) B( p' x
文章目录4 @4 ^/ B& c" a( s
第八章 文本数据7 t$ M' r, i- ~( \
8.1 str对象/ y6 l f; h- F5 @2 `
8.1.1 str对象的设计意图1 L6 C( L3 L$ y W9 b. L$ a
8.1.3 string类型5 G* H. j( t& Q+ x& v7 T2 o
8.2 正则表达式基础+ j0 j( j! w# ^5 D
8.2.1 . 一般字符的匹配: q0 }, A4 j7 Z, }; P
8.2.2 元字符基础9 |9 F5 z9 e' k3 R3 |3 s
8.2.3 简写字符集+ h" w& p) J& L
8.3 文本处理的五类操作4 d. F3 ~7 n3 B# C! o, U8 ]3 B
8.3.1 `str.split `拆分 7 k" O b* h$ Q8.3.2 `str.join` 或 `str.cat `合并# P8 V9 b5 v4 ^$ S
8.3.3 匹配 % {( R- U N! {8 {8.3.5 提取6 N# M' I/ v7 l9 L' m4 z! v0 c
8.4、常用字符串函数' I i# W j, s% A7 w
8.4.1 字母型函数! u c, ~( {8 a( r4 `* U
8.4.2 数值型函数 7 ?9 @$ D6 \8 V) u8.4.3 统计型函数 % [! `8 B1 U, c" _2 @5 i6 I9 ^8.4.4 格式型函数. Q8 i8 ?+ f6 }$ \4 I
8.5 练习 9 m- ~0 ^7 q" k/ y1 R9 DEx1:房屋信息数据集, N G3 y7 G: g& q! Z+ B$ @ P' r
Ex2:《权力的游戏》剧本数据集 , W% c4 Z! d4 _第九章 分类数据4 V& t1 k2 Y" I ~* q2 o
9.1 cat对象: A1 E0 ?7 _# O2 L5 O
9.1.1 cat对象的属性2 `: f7 }1 X% u& n
9.1.2 类别的增加、删除和修改 ; K* G( S. i9 L$ a) N* }0 [2 V9.2 有序分类 7 R5 L" O+ f& |) q9.2.1 序的建立 * \+ r2 b1 \5 q' P1 T9.2.2 排序和比较 ' x( p- f3 Q: E9.3 区间类别 3 B( }5 w: N( Z6 T! t f7 O: k& O9.3.1 利用cut和qcut进行区间构造+ F0 Z2 G" W2 ~9 ~
9.3.2 一般区间的构造: ~9 k1 ]8 O( ^' T% D) F" W: A7 r W
9.3.3 区间的属性与方法' }2 K2 V( G& O2 Z
9.4 练习/ u: p! j8 ~( }! A; C" c+ H1 m& k- j& x
Ex1: 统计未出现的类别: e. i% o: z; \1 m) H: z' r+ S
Ex2: 钻石数据集: t8 |& \) V: E0 ]; q4 i# ]
第十章 时序数据! g+ {) |$ U, D8 ] N* ^6 Z
10.1 时序中的基本对象0 A& q. R ~0 e+ [( s
10.2 时间戳 % p, Y% e- X. [10.2.1 Timestamp的构造与属性) V( O$ S; S1 v; A8 P% n
10.2.2 Datetime序列的生成 4 I; ^! B3 n7 X$ c) ]$ {10.2.3 dt对象$ s9 y' N; J7 }- G! j; Y+ X
10.2.4 时间戳的切片与索引 . Z: L) D5 M2 {$ h10.3 时间差 ; T3 b [ v( y9 e$ d10.3.1 Timedelta的生成4 p' k9 r; a `# y$ j- Q
10.2.2 Timedelta的运算( H' \. e2 o. u% O3 r) J3 \
10.4 日期偏置 # |" L: }! Z' o1 k10.4.1 Offset对象 , d& V( l" r7 j- y9 K0 g: u10.4.2 偏置字符串* v8 ~, o; K; g4 G' m+ b7 S
10.5、时序中的滑窗与分组 ! p! G1 s2 ^' e% Q! h# q! Y+ {10.5.1 滑动窗口 0 r3 M( A. K& n. k2 T7 J8 A10.5.2 重采样4 {% c6 ~ y( ` k+ l2 h" r
10.6 练习1 C% ]& K2 X% C0 @+ t# n8 c
Ex1:太阳辐射数据集$ \. Q5 k& B: H/ {: H I
Ex2:水果销量数据集' n6 [# S! j; g6 X2 a; k
课程资料《pandas数据处理与分析》、github地址、讲解视频、习题参考答案 、pandas官网# ~2 p' `3 |6 f/ g; M
传送门:. l/ ]) J* i7 |/ V: P
# u; h3 M' V% s$ e) z
datawhale8月组队学习《pandas数据处理与分析》(上)(基础、索引、分组)$ Q" I& ~6 p* J
datawhale8月组队学习《pandas数据处理与分析》(中)(变形、连接、缺失数据) 7 n; _6 z @: f0 y+ J第八章 文本数据 5 W% N7 q+ O5 Q2 v- a8.1 str对象& h, G/ G1 s) u7 d7 q+ Y
8.1.1 str对象的设计意图 A# `( @; a7 u @$ X/ }5 O
str 对象是定义在 Index 或 Series上的属性,专门用于处理每个元素的文本内容,其内部定义了大量方法,因此对一个序列进行文本处理,首先需要获取其 str 对象。在Python标准库中也有 str 模块,为了使用上的便利,在 pandas 的50个 str 对象方法中,有31个是和标准库中的 str 模块方法同名且功能一致,例如字母转为大写的操作: ' B+ V8 g8 n: K7 e* U& Q , l* N% \0 @" O$ O3 \8 svar = 'abcd' ( c) ~4 f; d }3 Tstr.upper(var) # Python内置str模块' ~# N( r [1 D. q2 x4 m; e9 x
Out[4]: 'ABCD'/ P6 d1 Q! ~! p" Y% H& x
& P: l7 D; h( J4 A# ps = pd.Series(['abcd', 'efg', 'hi']) f, Z* y8 Z. D0 O( U. g
9 J0 J9 n. a5 ]+ ]) H
s.str- c5 o2 H: X" G& u; I [$ z
Out[6]: <pandas.core.strings.accessor.StringMethods at 0x2b796892d60>5 V |, n- d" u. Q% ^0 L
7 h7 z' B9 C3 W2 ]) x* L7 ?s.str.upper() # pandas中str对象上的upper方法8 U- S$ C/ I3 z
Out[7]: - @7 U# a7 a$ j% T, S" Q0 ABCD- n" B7 A0 E0 H5 Q. Z
1 EFG$ {+ L6 V/ d5 V; e! ^
2 HI4 s0 b& G; B7 p" S d- S& l
dtype: object ! I4 t1 d V; J" h1 8 R, e2 u( ^6 `( _) J' W" S; W2 ' Y$ q6 B" A" i" i* E8 Q: v3 ' v [" L/ T- N49 X$ H) G; ?7 l6 w
51 x, z2 K9 O1 y4 ]! A8 ?
6& M# M& t+ b0 z% T0 w
7 : R) n. n4 i, [! R8 B# ]8 ( N( o. x' U. S3 K1 t \! V) `9 ' F, G9 T+ [4 U! U% z10& l. t5 I1 u c! K
118 ^+ q' l- @" Q
12 7 S3 B0 N* @" b, i& I# m0 L13 1 c7 i9 U+ ?/ F146 _5 V% a/ ]- ^( ^* x; y, g; o
15 6 s5 |: B+ ]* {5 t; {$ ?" J& n2 z0 P# A8.1.2 []索引器6 ~& U3 S' z$ R2 x
对于 str 对象而言,可理解为其对字符串进行了序列化的操作,例如在一般的字符串中,通过 [] 可以取出某个位置的元素,同时也能通过切片得到子串。6 ?( e; F. p+ }. K5 O* }
pandas中过对 str 对象使用 [] 索引器,可以完成完全一致的功能,并且如果超出范围则返回缺失值:5 m3 i. l5 A9 Q" \- W [8 b
4 y0 l2 A4 \1 N% X! [! A
s.str[0] : |" h0 U9 f& f5 P. r* T) I2 @. {% d. gOut[10]: p- q2 G$ Q4 [. s8 o0 a7 v( i7 A2 U- r: e9 U
1 e. ^" y( ]" E' ~/ S( `
2 h # t9 X: V, T$ K& Q! ]5 N; G2 Mdtype: object; H9 y( O0 q6 Q: Z$ z/ Y
5 y: ^, b7 a; `( ~( K- n& |
s.str[-1: 0: -2] , T: L& H/ G5 N# m/ ]1 j; b, WOut[11]: 1 G q7 f1 K. E1 I N, H
0 db $ c! l6 r9 P. O7 ~( F1 g ! P7 l8 [( [9 W2 i 0 M: Z4 ~) w' U! x1 `. j, P6 bdtype: object: w' H, l: B1 i/ J! e& ~1 }, `
( E0 W# w* B; y% Hs.str[2]7 v6 A( q3 ?7 X H8 r
Out[12]: 4 e4 o4 R% ^: X5 K+ N1 G
0 c " Z% ] f( }% N3 F4 z6 a1 g7 ^' C2 n( O* `% S3 y( k0 a
2 NaN ) p% _1 h+ k& ~dtype: object2 }' q2 o0 \9 S
3 o# `& `- H; }7 H+ a" c
1; U5 }* Y8 [$ |1 y; E
2 Q1 c# E' F4 q! o- Z* y
3! p1 E, V" i, _6 O# W* E
4 " i" Y* T9 q E5 9 W2 e2 Y4 R+ m2 @7 J @# u) _6 - g, U/ V! H- {6 ?79 ]$ T( [+ X, O8 I& \0 }, N: S: t
8 }/ v7 I" S9 T( H3 w) u
9 - R; ^ @& n4 r$ J: D. m10 9 ?$ W+ I3 T0 \9 I4 a H/ G4 r2 G R112 M- a- k% @; s# Z+ l* |& Y
123 g) `5 M2 u& w. b1 y- X! q. ?, r
13 * r9 z9 h- K4 s- @& n1 U/ N4 b8 I0 g148 I# X* t* `" h6 z1 j
15$ g3 s& |; |3 u3 J
160 `8 z" b7 W. D5 C
17/ P* z; }+ B& x9 m, [" @- m
184 W5 [) ^! F: S
19 0 R t# u5 ^$ B4 R! _( F5 _: j20# E/ i# n' w8 f9 w q
import numpy as np3 d( r) g# w D# ?( P$ [, @
import pandas as pd # i9 C0 B7 N" X' v Z. j. A( X M& w: [$ Z% t) i& F
s = pd.Series(['abcd', 'efg', 'hi'])+ T& q* e' j6 ], Y* M! Q
s.str[0]* Z; _- D: u V, q& Y6 \
1 . Q- a$ H$ o( e% ~2 k. f/ |! z2: U# H8 |3 V" R" D- e& u
3 1 d, l( B! m/ v& d$ Z4+ ?% o- D, n( R9 S1 ^1 b
5) c r. z. A2 w/ g
0 a& r+ j0 Z. U7 A8 {+ o
1 e! X; N6 ^+ @, F7 t7 d/ Y
2 h$ `1 h( y: |4 r9 u+ h+ i1 D8 Y
dtype: object 5 z2 |0 H# z( {, d3 }! K1, b7 r& W4 Y6 C( g
2 ! u0 d7 ]3 d' `0 _8 r$ z3 1 `9 y& L9 A3 B( `; u/ W# c/ j4 % ?/ O# K' f! s( v1 g* y3 j* ^8.1.3 string类型! _5 r2 j3 m# g# y5 ~
在上一章提到,从 pandas 的 1.0.0 版本开始,引入了 string 类型,其引入的动机在于:原来所有的字符串类型都会以 object 类型的 Series 进行存储,但 object 类型只应当存储混合类型,例如同时存储浮点、字符串、字典、列表、自定义类型等,因此字符串有必要同数值型或 category 一样,具有自己的数据存储类型,从而引入了 string 类型。 ( X3 t! c8 V5 B% ~ 总体上说,绝大多数对于 object 和 string 类型的序列使用 str 对象方法产生的结果是一致,但是在下面提到的两点上有较大差异: r. k4 j# P1 p: n* F) C" t9 r" m6 o. y. f6 a! ?9 B8 b5 ^, i
二者对于某些对象的 str 序列化方法不同。 7 ~; I/ |5 ~0 M) q# {& f6 C可迭代(Iterable)对象包括但不限于字符串、字典、列表。对于一个可迭代对象, string 类型和 object 类型对它们的序列化方式不同,序列化后str对象返回结果也可能不同。例如:, t, ~; M% d, Q, n# z& o+ | Z9 G
s = pd.Series([{1: 'temp_1', 2: 'temp_2'}, ['a', 'b'], 0.5, 'my_string']) : {; w, O. X+ z* f9 hs . ^: t$ L$ C; G( O11 N* _/ a- G4 s
27 X8 R" I3 j5 `5 U* q3 ?
0 {1: 'temp_1', 2: 'temp_2'} ( _3 J8 f! T! v! h+ S8 i1 [a, b] % x. N o7 R8 y" h7 B2 0.5; g! E/ G6 t& _
3 my_string! c! x4 n: _9 N; j) ?; m# M3 A' ^
dtype: object 8 T7 Q+ L# C5 r: i+ d' P1 , G# c: |! ]( H+ f8 g7 B20 l& G+ l0 K* w% M5 x
31 |+ V) b0 p. ~ V1 g0 ~
44 g# o4 o9 Q, U3 @; S2 m" `1 H L5 c, [, ?
5' R5 z& \8 b; L- Q: ?
s.str[1] # 对每个元素取[1]的操作- X+ o8 T4 h) @/ _
1; Q( d3 k6 z0 w
0 temp_1 3 I: |* X( y! z3 I; f! g1 b+ r5 Z+ l$ @1 s* l% i& j
2 NaN+ Q: P1 }3 G, U4 M
3 y 4 E6 p# e) G9 Y+ @! Wdtype: object x- E6 F0 g1 n. j0 e# B16 y+ g* O; H4 k0 Y7 K. v
28 W( l9 B- P O# I
3 3 c! l# @) `1 \ N5 [9 O41 `3 Y$ l7 o6 k4 W" Y/ d
53 v8 u3 {2 L- d
s.astype('string').str[1] ) w- F0 O3 `/ d1 l A8 x/ c* H j& y1( v# p, F' k' [, K1 q& \- B
0 1% Z: E: b3 h) D9 s
1 ' % \9 @8 v5 t: |# X3 A( g2 . + i+ Z0 E( N5 m1 k% k3 y $ _9 z$ J& Q# W" W3 N9 P& A mdtype: string , V5 s" _% v' E* l1$ o" q$ N, ?# T+ F2 r. D
23 h( K7 t: r T+ ~2 [
3 : J5 M- W" @, |/ [& [ {4- X" W0 @4 \" }0 F Y T
5% @ X* ^$ R( g% w# Q
除了最后一个字符串元素,前三个元素返回的值都不同,其原因在于: s' y Y4 _, Y5 M1 m
! P/ k6 g: W( Z
当序列类型为 object 时,是对于每一个元素进行 [] 索引,因此对于字典而言,返回temp_1字符串,对于列表则返回第二个值,而第三个为不可迭代对象,返回缺失值,第四个是对字符串进行 [] 索引。 ; t& j$ S0 b2 X! @- B0 k! Estring 类型的 str 对象先把整个元素转为字面意义的字符串,例如对于列表而言,第一个元素即 “{”,而对于最后一个字符串元素而言,恰好转化前后的表示方法一致,因此结果和 object 类型一致。 3 d* r) u, H; Bstring 类型是 Nullable 类型,但 object 不是 6 g5 D+ u8 f! ~) b7 R; K 这意味着 string 类型的序列,如果调用的 str 方法返回值为整数 Series 和布尔 Series 时,其分别对应的 dtype 是 Int 和 boolean 的 Nullable 类型,而 object 类型则会分别返回 int/float 和 bool/object ,不过这取决于缺失值的存在与否。 3 S" I$ [5 [* l( u 同时,字符串的比较操作,也具有相似的特性, string 返回 Nullable 类型,但 object 不会。 # j; m/ W7 l5 ms = pd.Series(['a']) 5 f) u) T/ @8 V5 H5 i0 C( p" D: S7 o J* V3 D
s.str.len()7 ^8 j+ \! f Q4 a& ^, y
Out[17]: & j+ R o: D, K# i& @
0 1 % A& w* P& j" A: U1 Sdtype: int648 |8 r6 S$ w/ }$ e0 Q" f5 ]
8 J9 X/ ^9 E1 T0 {( vs.astype('string').str.len()- q8 J0 X: y4 a+ R6 g
Out[18]: 7 s' }* g5 A) n u) @7 E, Y: f) l- c0 1 1 B$ B7 T$ W# P) k- N! {, gdtype: Int64 % d [- i. N1 h1 Y ) I( f( C: f/ m# h) zs == 'a' 4 B1 `5 d j" `2 d2 `Out[19]: . d' J8 P1 W. j% |3 w$ |; H8 u0 True r+ v* I- S, adtype: bool 5 D8 C% y" S' k # ?4 Z1 ?* ]3 Z" p9 h2 Q0 o$ T4 J9 {s.astype('string') == 'a'( q9 K( q8 Z+ L( k0 h! w$ h/ {2 c
Out[20]: . q& ~, T* w4 h0 Y& |( t0 True4 @ ~& a' @" W3 r: ?& j% t2 X
dtype: boolean 1 @" U7 r: M6 X, v% K3 ]( D/ Y4 g# P: C6 i5 ~
s = pd.Series(['a', np.nan]) # 带有缺失值: O& K2 Q+ c. s7 o/ A1 ~
. n* m. L( | N5 K
s.str.len(), H) o, t+ ]4 W# J& Q- Y/ o: p
Out[22]: % t( t' {& l. z7 [+ B- g \0 1.0; }9 S5 F* Z& g* A y! q7 d3 X
1 NaN $ t7 h6 Z' G# S. Q6 V) Ddtype: float64 J' I @) `: B& n- @5 t