如何在Pandas数据框架中预处理字符串数据
有时,我们要处理的数据可能被塞在一列中,但为了我们能对数据进行处理,数据应该被分散到不同的列中,而且这些列必须是不同的数据类型。当所有的数据被合并到一个字符串中时,需要对该字符串进行预处理。这篇文章是关于在Pandas DataFrame中预处理字符串数据。
方法一:通过使用PandasSeries.str.extract()函数
语法:
Series.str.extract(pat, flags=0, expand=True)
参数:
- pat:帮助我们将数据分成几列的regex表达式。
- flags:默认为0,没有标志,参数为int。
- expand: 如果为真,则返回一个每个捕获组有一列的DataFrame。
返回:
方法返回一个数据框架或系列
第1步:导入软件包
Pandas软件包已导入。
# import packages
import pandas as pd
第2步:创建数据框架:
pd.DataFrame()方法是用来创建一个给定的字典的数据框架。我们创建一个需要预处理的数据框架。所有的数据都驻留在开始时的一个字符串格式的单列中。
# creating data
data = {'CovidData': ['Anhui 1.0 2020-01-22 17:00:00',
'Beijing 14.0 2020-01-22 17:00:00',
'Washington 1.0 2020-01-24 17:00:00',
'Victoria 3.0 2020-01-31 23:59:00',
'Macau 10.0 2020-02-06 14:23:04']}
#creating a pandas dataframe
dataset = pd.DataFrame(data)
str.extract()接收一个重码表达式字符串和其他参数来提取数据到列中。(….-…-… …:…:…)用于提取格式为(yyyy-mm-dd hh:mm:ss)的日期,Datetime对象是这种格式的。
dataset['LastUpdated'] = dataset['CovidData'].str.extract(
'(....-..-.. ..:..:..)', expand=True)
dataset['LastUpdated']
输出:

str.extract()接收一个regex表达式字符串”([A-Za-z]+)”,它提取的是有字母的字符串。
dataset['State'] = dataset['CovidData'].str.extract('([A-Za-z]+)', expand=True)
dataset['State']
输出:

‘(\d+.\d)’是用来匹配小数的。+代表’.’(小数)前的一个或多个数字和小数后的一个数字,例如:12.1,3.5等。
dataset['confirmed_cases'] = dataset['CovidData'].str.extract(
'(\d+.\d)', expand=True)
dataset['confirmed_cases']
输出:

预处理前的数据框架:

预处理后的数据框架:

方法2:使用apply()函数
在这个方法中,我们预处理了一个包含电影评论的数据集,它就是烂番茄数据集。我们导入了Pandas的包、re和stop_words包。我们在一个叫做stop_words的变量中存储停止词。数据集是在pd.read_csv()方法的帮助下导入的。我们使用apply()方法来预处理字符串数据。str.lower用于将所有字符串数据转换为小写字母。re.sub(r'[^\w\s]’, “, x)帮助我们摆脱标点符号,最后,我们从字符串数据中删除stop_words。由于CSV文件很大,所以显示了一部分数据,以看到其中的差别。
查看和下载CSV文件,请点击这里。
# import packages
import pandas as pd
from stop_words import get_stop_words
import re
# stop words
stop_words = get_stop_words('en')
# reading the csv file
data = pd.read_csv('test.csv')
print('Before string processing : ')
print(data[(data['PhraseId'] >= 157139) & (
data['PhraseId'] <= 157141)]['Phrase'])
# converting all text to lower case in the Phrase column
data['Phrase'] = data['Phrase'].apply(str.lower)
# using regex to remove punctuation
data['Phrase'] = data['Phrase'].apply(lambda x: re.sub(r'[^\w\s]', '', x)
)
# removing stop words
data['Phrase'] = data['Phrase'].apply(lambda x: ' '.join(
w for w in x.split() if w not in stop_words))
print('After string processing : ')
data[(data['PhraseId'] >= 157139) & (data['PhraseId'] <= 157141)]['Phrase']
输出:

极客教程