如何用pandas对excel中的文本数据进行操作

无人久伴 提交于 2021-01-01 11:01:16

excel进行数据的操作最便捷的库是pandas,但是如何使用pandas对excel中的文本进行清洗,这是一个很技巧性的工作。之前常见的思路是操作结果保存到新的excel文件中,这会让代码可读性和清洗速度大大降低,这很不pythonic,所以今天分享pandas的文本数据处理技巧。

pandas中有Series和DataFrame两种数据结构,Series是一种数组,DataFrame是一种表(每一行数据是一条记录,每一列是一个变量)。

如何用pandas对excel中的文本数据进行操作

上图整体是一个DataFrame,图中的每一绿色圈中的是一个Series。

在Series中有str方法,本文所有的方法都是在Series对象基础上进行的操作。

Series.str方法
Series.str可以对某一序列中的每个文本数据进行批处理,一般返回的结果是数组。

如何用pandas对excel中的文本数据进行操作

上面内容看不懂没关系,我们通过代码帮助你理解


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

如何用pandas对excel中的文本数据进行操作

选择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
)

如何用pandas对excel中的文本数据进行操作


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

如何用pandas对excel中的文本数据进行操作


df
.
Airline
.
str
.
extract
(
'([a-zA-Z\s]+)'
)

如何用pandas对excel中的文本数据进行操作

使用正则表达式,对From_To列进行提取操作,获得出发地和目的地。


df
.
From_To
.
str
.
extract
(
'([a-zA-Z\s]+)_([a-zA-Z\s]+)'
)

如何用pandas对excel中的文本数据进行操作

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

如何用pandas对excel中的文本数据进行操作

查找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

如何用pandas对excel中的文本数据进行操作

将Airline列合并成一个大的字符串,用空格间隔


df
.
Airline
.
str
.
cat
(
sep
=
' '
)

Run

'KLM(!) &lt;Air France&gt; (12) (British Airways. ) 12. Air France "Swiss Air"'

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!