excel进行数据的操作最便捷的库是pandas,但是如何使用pandas对excel中的文本进行清洗,这是一个很技巧性的工作。之前常见的思路是操作结果保存到新的excel文件中,这会让代码可读性和清洗速度大大降低,这很不pythonic,所以今天分享pandas的文本数据处理技巧。
pandas中有Series和DataFrame两种数据结构,Series是一种数组,DataFrame是一种表(每一行数据是一条记录,每一列是一个变量)。
上图整体是一个DataFrame,图中的每一绿色圈中的是一个Series。
在Series中有str方法,本文所有的方法都是在Series对象基础上进行的操作。
Series.str方法
Series.str可以对某一序列中的每个文本数据进行批处理,一般返回的结果是数组。
上面内容看不懂没关系,我们通过代码帮助你理解
import
pandas
as
pd
import
numpy
as
np
df
=
pd
.
DataFrame
({
'From_To'
:
[
' LoNDon_paris '
,
' MAdrid_miLAN '
,
' londON_StockhOlm '
,
'Budapest_PaRis'
,
'Brussels_londOn'
],
'FlightNumber'
:
[
10045
,
np
.
nan
,
10065
,
np
.
nan
,
10085
],
'RecentDelays'
:
[[
23
,
47
],
[],
[
24
,
43
,
87
],
[
13
],
[
67
,
32
]],
'Airline'
:
[
'KLM(!)'
,
'<Air France> (12)'
,
'(British Airways. )'
,
'12. Air France'
,
'"Swiss Air"'
]})
df
选择From_To列,得到Series类型数据
df
.
From_To
Run
0
LoNDon_paris
1
MAdrid_miLAN
2
londON_StockhOlm
3
Budapest_PaRis
4
Brussels_londOn
Name
:
From_To
,
dtype
:
object
upper/lower
将Airline列中的每一项变为大写
df
.
From_To
.
str
.
upper
()
Run
0
LONDON_PARIS
1
MADRID_MILAN
2
LONDON_STOCKHOLM
3
BUDAPEST_PARIS
4
BRUSSELS_LONDON
Name
:
From_To
,
dtype
:
object
将From_To列中的每一项变为小写
**
df
.
From_To
.
str
.
lower
()
**
Run
0
london_paris
1
madrid_milan
2
london_stockholm
3
budapest_paris
4
brussels_london
Name
:
From_To
,
dtype
:
object
len
求From_To列每一项的长度
df
.
From_To
.
str
.
len
()
Run
0
14
1
14
2
18
3
14
4
15
Name
:
From_To
,
dtype
:
int64
split分割
对FromTo列中每一项按照""进行切割。注意这里expand参数
df
.
From_To
.
str
.
split
(
'_'
,
expand
=
True
)
df
.
From_To
.
str
.
split
(
'_'
,
expand
=
False
)
Run
0
[
LoNDon
,
paris
]
1
[
MAdrid
,
miLAN
]
2
[
londON
,
StockhOlm
]
3
[
Budapest
,
PaRis
]
4
[
Brussels
,
londOn
]
Name
:
From_To
,
dtype
:
object
contains
From_To列中每项是否含有'Brussels'这个字段,返回布尔值
df
.
From_To
.
str
.
contains
(
'Brussels'
)
Run
0
False
1
False
2
False
3
False
4
True
Name
:
From_To
,
dtype
:
bool
startswith
From_To列中每项是否含以'B'作为开头,返回布尔值
df
.
From_To
.
str
.
strip
().
str
.
startswith
(
'B'
)
Run
0
False
1
False
2
False
3
True
4
True
Name
:
From_To
,
dtype
:
bool
endswith
From_To列中每项是否含以'n'作为结尾,返回布尔值
df
.
From_To
.
str
.
strip
().
str
.
endswith
(
'm'
)
Run
0
False
1
False
2
True
3
False
4
False
Name
:
From_To
,
dtype
:
bool
findall
把RecentDelays列中的列表
df
.
RecentDelays
Run
0
[
23
,
47
]
1
[]
2
[
24
,
43
,
87
]
3
[
13
]
4
[
67
,
32
]
Name
:
RecentDelays
,
dtype
:
object
extract
清洗Airline列,使其每一项只拥有字母和空格。我们先看看数据
df
df
.
Airline
.
str
.
extract
(
'([a-zA-Z\s]+)'
)
使用正则表达式,对From_To列进行提取操作,获得出发地和目的地。
df
.
From_To
.
str
.
extract
(
'([a-zA-Z\s]+)_([a-zA-Z\s]+)'
)
findall(pat)
查找Series中每一项是否含有pat
s
=
pd
.
Series
([
'Lion'
,
'Monkey'
,
'Rabbit'
])
s
Run
0
Lion
1
Monkey
2
Rabbit
dtype
:
object
查找Series中每一项是否含有Monkey
s
.
str
.
findall
(
'Monkey'
)
Run
0
[]
1
[
Monkey
]
2
[]
dtype
:
object
我们先看看df
df
查找From_To列中是否有Paris
df
.
From_To
.
str
.
lower
().
str
.
findall
(
'paris'
)
Run
0
[
paris
]
1
[]
2
[]
3
[
paris
]
4
[]
Name
:
From_To
,
dtype
:
object
replace
将FromTo列中的""换为">"
df
.
From_To
.
str
.
replace
(
'_'
,
' > '
)
Run
0
LoNDon
>
paris
1
MAdrid
>
miLAN
2
londON
>
StockhOlm
3
Budapest
>
PaRis
4
Brussels
>
londOn
Name
:
From_To
,
dtype
:
object
get
get(i) 获得序列中每一项第i个位置的数据
s1
=
pd
.
Series
([
'abc'
,
'bed'
,
'aaa'
,
'eee'
])
s1
Run
0
abc
1
bed
2
aaa
3
eee
dtype
:
object
获得s1序列中每项文本的第2个位置的数据
s1
.
str
.
get
(
1
)
Run
0
b
1
e
2
a
3
e
dtype
:
object
获得s1序列中每项文本的最后一个位置的数据
s1
.
str
.
get
(-
1
)
Run
0
c
1
d
2
a
3
e
dtype
:
object
join
join(sep) 按照sep对每一项文本序列数据进行拼接。注意遇到非文本数据,不进行拼接,返回nan
s2
=
pd
.
Series
([[
'lion'
,
'elephant'
,
'zebra'
],
[
1.1
,
2.2
,
3.3
],
[
'cat'
,
np
.
nan
,
'dog'
],
[
'cow'
,
4.5
,
'goat'
],
[
'duck'
,
[
'swan'
,
'fish'
],
'guppy'
]])
s2
Run
0
[
lion
,
elephant
,
zebra
]
1
[
1.1
,
2.2
,
3.3
]
2
[
cat
,
nan
,
dog
]
3
[
cow
,
4.5
,
goat
]
4
[
duck
,
[
swan
,
fish
],
guppy
]
dtype
:
object
将s2中每一项用空格拼接
s2
.
str
.
join
(
' '
)
Run
0
lion elephant zebra
1
NaN
2
NaN
3
NaN
4
NaN
dtype
:
object
cat
Series.str.cat(sep, narep)|按照sep对数组进行合并(如果遇到nan,以narep替代),注意该方法返回字符串
df
将Airline列合并成一个大的字符串,用空格间隔
df
.
Airline
.
str
.
cat
(
sep
=
' '
)
Run
'KLM(!) <Air France> (12) (British Airways. ) 12. Air France "Swiss Air"'