查看原文
其他

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

大邓 大邓和他的Python 2022-07-09

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

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

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

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

Series.str方法

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

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

  1. import pandas as pd

  2. import numpy as np


  3. df = pd.DataFrame({'From_To': [' LoNDon_paris ', ' MAdrid_miLAN ', ' londON_StockhOlm ',

  4. 'Budapest_PaRis', 'Brussels_londOn'],

  5. 'FlightNumber': [10045, np.nan, 10065, np.nan, 10085],

  6. 'RecentDelays': [[23, 47], [], [24, 43, 87], [13], [67, 32]],

  7. 'Airline': ['KLM(!)', '<Air France> (12)', '(British Airways. )',

  8. '12. Air France', '"Swiss Air"']})

  9. df

选择From_To列,得到Series类型数据

  1. df.From_To

Run

  1. 0 LoNDon_paris

  2. 1 MAdrid_miLAN

  3. 2 londON_StockhOlm

  4. 3 Budapest_PaRis

  5. 4 Brussels_londOn

  6. Name: From_To, dtype: object

upper/lower

将Airline列中的每一项变为大写

  1. df.From_To.str.upper()

Run

  1. 0 LONDON_PARIS

  2. 1 MADRID_MILAN

  3. 2 LONDON_STOCKHOLM

  4. 3 BUDAPEST_PARIS

  5. 4 BRUSSELS_LONDON

  6. Name: From_To, dtype: object

将From_To列中的每一项变为小写

  1. df.From_To.str.lower()

Run

  1. 0 london_paris

  2. 1 madrid_milan

  3. 2 london_stockholm

  4. 3 budapest_paris

  5. 4 brussels_london

  6. Name: From_To, dtype: object

len

求From_To列每一项的长度

  1. df.From_To.str.len()

Run

  1. 0 14

  2. 1 14

  3. 2 18

  4. 3 14

  5. 4 15

  6. Name: From_To, dtype: int64

split分割

对FromTo列中每一项按照""进行切割。注意这里expand参数

  1. df.From_To.str.split('_', expand=True)

  1. df.From_To.str.split('_', expand=False)

Run

  1. 0 [ LoNDon, paris ]

  2. 1 [ MAdrid, miLAN ]

  3. 2 [ londON, StockhOlm ]

  4. 3 [Budapest, PaRis]

  5. 4 [Brussels, londOn]

  6. Name: From_To, dtype: object

contains

From_To列中每项是否含有'Brussels'这个字段,返回布尔值

  1. df.From_To.str.contains('Brussels')

Run

  1. 0 False

  2. 1 False

  3. 2 False

  4. 3 False

  5. 4 True

  6. Name: From_To, dtype: bool

startswith

From_To列中每项是否含以'B'作为开头,返回布尔值

  1. df.From_To.str.strip().str.startswith('B')

Run

  1. 0 False

  2. 1 False

  3. 2 False

  4. 3 True

  5. 4 True

  6. Name: From_To, dtype: bool

endswith

From_To列中每项是否含以'n'作为结尾,返回布尔值

  1. df.From_To.str.strip().str.endswith('m')

Run

  1. 0 False

  2. 1 False

  3. 2 True

  4. 3 False

  5. 4 False

  6. Name: From_To, dtype: bool

findall

把RecentDelays列中的列表

  1. df.RecentDelays

Run

  1. 0 [23, 47]

  2. 1 []

  3. 2 [24, 43, 87]

  4. 3 [13]

  5. 4 [67, 32]

  6. Name: RecentDelays, dtype: object

extract

清洗Airline列,使其每一项只拥有字母和空格。我们先看看数据

  1. df

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

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

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

findall(pat)

查找Series中每一项是否含有pat

  1. s = pd.Series(['Lion', 'Monkey', 'Rabbit'])

  2. s

Run

  1. 0 Lion

  2. 1 Monkey

  3. 2 Rabbit

  4. dtype: object

查找Series中每一项是否含有Monkey

  1. s.str.findall('Monkey')

Run

  1. 0 []

  2. 1 [Monkey]

  3. 2 []

  4. dtype: object

我们先看看df

  1. df

查找From_To列中是否有Paris

  1. df.From_To.str.lower().str.findall('paris')

Run

  1. 0 [paris]

  2. 1 []

  3. 2 []

  4. 3 [paris]

  5. 4 []

  6. Name: From_To, dtype: object

replace

将FromTo列中的""换为">"

  1. df.From_To.str.replace('_', ' > ')

Run

  1. 0 LoNDon > paris

  2. 1 MAdrid > miLAN

  3. 2 londON > StockhOlm

  4. 3 Budapest > PaRis

  5. 4 Brussels > londOn

  6. Name: From_To, dtype: object

get

get(i) 获得序列中每一项第i个位置的数据

  1. s1 = pd.Series(['abc', 'bed', 'aaa', 'eee'])

  2. s1

Run

  1. 0 abc

  2. 1 bed

  3. 2 aaa

  4. 3 eee

  5. dtype: object

获得s1序列中每项文本的第2个位置的数据

  1. s1.str.get(1)

Run

  1. 0 b

  2. 1 e

  3. 2 a

  4. 3 e

  5. dtype: object

获得s1序列中每项文本的最后一个位置的数据

  1. s1.str.get(-1)

Run

  1. 0 c

  2. 1 d

  3. 2 a

  4. 3 e

  5. dtype: object

join

join(sep) 按照sep对每一项文本序列数据进行拼接。注意遇到非文本数据,不进行拼接,返回nan

  1. s2 = pd.Series([['lion', 'elephant', 'zebra'],

  2. [1.1, 2.2, 3.3],

  3. ['cat', np.nan, 'dog'],

  4. ['cow', 4.5, 'goat'],

  5. ['duck', ['swan', 'fish'], 'guppy']])

  6. s2

Run

  1. 0 [lion, elephant, zebra]

  2. 1 [1.1, 2.2, 3.3]

  3. 2 [cat, nan, dog]

  4. 3 [cow, 4.5, goat]

  5. 4 [duck, [swan, fish], guppy]

  6. dtype: object

将s2中每一项用空格拼接

  1. s2.str.join(' ')

Run

  1. 0 lion elephant zebra

  2. 1 NaN

  3. 2 NaN

  4. 3 NaN

  5. 4 NaN

  6. dtype: object

cat

Series.str.cat(sep, narep)|按照sep对数组进行合并(如果遇到nan,以narep替代),注意该方法返回字符串

  1. df

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

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

Run

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


推荐阅读

【视频课程】Python爬虫与文本数据分析

VADER:社交网络文本情感分析库

如何用nbmerge合并多个notebook文件?   

Handout库:能将python脚本转化为html展示文件

自然语言处理库nltk、spacy安装及配置方法

datatable:比pandas更快的GB量级的库

国人开发的数据可视化神库 pyecharts

pandas_profiling:生成动态交互的数据探索报告

cufflinks: 让pandas拥有plotly的炫酷的动态可视化能力

使用Pandas、Jinja和WeasyPrint制作pdf报告

使用Pandas更好的做数据科学

使用Pandas更好的做数据科学(二)

少有人知的python数据科学库

folium:地图数据可视化库

学习编程遇到问题,该如何正确的提问?

如何用Google Colab高效的学习Python

大神kennethreitz写出requests-html号称为人设计的解析库

flashtext:大规模文本数据清洗利器

后台回复“20190818”,即可下载本教程代码。童鞋帮忙点赞评论转发~


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存