如何用pandas对excel中的文本数据进行操作
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"'
推荐阅读
Handout库:能将python脚本转化为html展示文件
pandas_profiling:生成动态交互的数据探索报告
cufflinks: 让pandas拥有plotly的炫酷的动态可视化能力
使用Pandas、Jinja和WeasyPrint制作pdf报告
大神kennethreitz写出requests-html号称为人设计的解析库
后台回复“20190818”,即可下载本教程代码。童鞋帮忙点赞评论转发~