如何用Pandas对Excel中的文本数据进行操作

640?wx_fmt=jpeg

#2019 AI开发者大会开幕仅剩3天# 

598元特惠学生票抢购中,扫码购票▲

作者 | 大邓

来源 | 大邓和他的Python(ID:DaDengAndHisPython)

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

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

640?wx_fmt=png

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

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

Series.str方法

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

640?wx_fmt=png

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

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

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

Run

'KLM(!) <Air France> (12) (British Airways. ) 12. Air France "Swiss Air"'

(*本文为Python大本营转载,转载请联系原作者)

精彩推荐

#2019 AI开发者大会开幕仅剩3天# 598元特惠学生票抢购中,李沐「深度学习实训营」+ 60余位技术大咖 + 9大技术主题分享,干货不断!点击阅读原文,即刻抢购。

640?wx_fmt=jpeg

推荐阅读

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值