数据分析和处理中,难免会遇到文本数据,比如人名,地名,还有其他的场景描述等等。金融数据,风控数据,营销数据等等,莫不如此。如何用pandas处理文本数据呢?
数据表,时间序列数据在数据分析建模中很常见,例如天气预报,空气状态监测,股票交易等金融场景。数据分析过程中重新调整,重塑数据表是很重要的技巧,此处选择Titanic数据,以及巴黎、伦敦欧洲城市空气质量监测 N O 2 NO_2 NO2数据作为样例。
数据分析
数据分析-Pandas如何转换产生新列
数据分析-Pandas如何统计数据概况
数据分析-Pandas如何轻松处理时间序列数据
数据分析-Pandas如何选择数据子集
数据分析-Pandas如何重塑数据表-CSDN博客
经典算法
经典算法-遗传算法的python实现
经典算法-模拟退火算法的python实现
经典算法-粒子群算法的python实现-CSDN博客
LLM应用
大模型查询工具助手之股票免费查询接口
Python技巧-终端屏幕打印光标和文字控制
本文用到的样例数据:
Titanic数据
空气质量监测 N O 2 NO_2 NO2数据
样例代码:
源代码参考 Pandas如何重塑数据表
源代码参考 python数据分析-数据表读写到pandas
导入关键模块
import pandas as pd
仍然使用titanic数据来举例,处理相关的非数值的文本数据:
In [1]: titanic = pd.read_csv("data/titanic.csv")
In [2]: titanic.head()
Out[2]:
PassengerId Survived Pclass ... Fare Cabin Embarked
0 1 0 3 ... 7.2500 NaN S
1 2 1 1 ... 71.2833 C85 C
2 3 1 3 ... 7.9250 NaN S
3 4 1 1 ... 53.1000 C123 S
4 5 0 3 ... 8.0500 NaN S
[5 rows x 12 columns]
有时候需要比较数据,但是字母的大小写不放不放比较,通常都是把字母统一处理为小写字母再做比较。且看如何把字母都小写处理:
In [3]: titanic["Name"].str.lower()
Out[3]:
0 braund, mr. owen harris
1 cumings, mrs. john bradley (florence briggs th...
2 heikkinen, miss. laina
3 futrelle, mrs. jacques heath (lily may peel)
4 allen, mr. william henry
...
886 montvila, rev. juozas
887 graham, miss. margaret edith
888 johnston, miss. catherine helen "carrie"
889 behr, mr. karl howell
890 dooley, mr. patrick
Name: Name, Length: 891, dtype: object
用str的lower方法即可把该列所有数据都转化为小写字母。
和str类似的,用Datetime对象时,也可以把时间序列采用dt的方法处理。
有时候,Boss突发奇想,看看相同姓的人归类,做个统计如何?
不用愁眉苦脸的,这里有一招分割大法,能解决80%的问题:
In [4]: titanic["Name"].str.split(",")
Out[4]:
0 [Braund, Mr. Owen Harris]
1 [Cumings, Mrs. John Bradley (Florence Briggs ...
2 [Heikkinen, Miss. Laina]
3 [Futrelle, Mrs. Jacques Heath (Lily May Peel)]
4 [Allen, Mr. William Henry]
...
886 [Montvila, Rev. Juozas]
887 [Graham, Miss. Margaret Edith]
888 [Johnston, Miss. Catherine Helen "Carrie"]
889 [Behr, Mr. Karl Howell]
890 [Dooley, Mr. Patrick]
Name: Name, Length: 891, dtype: object
使用序列的str.split()方法,通过逗号分隔,每个值都返回至少2个元素列表对象,第一个就是姓了。第二个就是逗号后面的部分。因此再用str的get方法获得第一个元素,就是歪果仁的姓了。
这里还示例了多个处理方法链接到一起的方式。
In [5]: titanic["Surname"] = titanic["Name"].str.split(",").str.get(0)
In [6]: titanic["Surname"]
Out[6]:
0 Braund
1 Cumings
2 Heikkinen
3 Futrelle
4 Allen
...
886 Montvila
887 Graham
888 Johnston
889 Behr
890 Dooley
Name: Surname, Length: 891, dtype: object
有时候Boss需要在一堆名字里找人,看她(他)是否在里头,咋办呢?
其实也很简单,依旧是str里的方法contains 搞定。
In [7]: titanic["Name"].str.contains("Countess")
Out[7]:
0 False
1 False
2 False
3 False
4 False
...
886 False
887 False
888 False
889 False
890 False
Name: Name, Length: 891, dtype: bool
只要找一个人,咋地给我一堆逻辑符号?不要怕,加个头衔就行。
众里寻他千百度,她却在灯火阑珊处。
这不是Titanic的Rothes吗?
In [8]: titanic[titanic["Name"].str.contains("Countess")]
Out[8]:
PassengerId Survived Pclass ... Cabin Embarked Surname
759 760 1 1 ... B77 S Rothes
[1 rows x 13 columns]
也可以来点统计,搞怪的。
看这里头谁的名字最长,多无聊啊!
依然是str的len方法先处理出长度,然后再让idxmax()找出最长名字的id,搞定。
In [9]: titanic["Name"].str.len()
Out[9]:
0 23
1 51
2 22
3 44
4 24
..
886 21
887 28
888 40
889 21
890 19
Name: Name, Length: 891, dtype: int64
In [10]: titanic["Name"].str.len().idxmax()
Out[10]: 307
既然找到了人名的位置,第几行,再把他的名字取出来看看是啥名字,有多长。当然,我们再利用loc函数用序号找到该行。看看名字有多长:
In [11]: titanic.loc[titanic["Name"].str.len().idxmax(), "Name"]
Out[11]: 'Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)'
除了姓名,性别也是文字数据呢。有时候就想把类型简化,方便处理,比如male 就简化为M,female简化为F:
In [12]: titanic["Sex_short"] = titanic["Sex"].replace({"male": "M", "female": "F"})
In [13]: titanic["Sex_short"]
Out[13]:
0 M
1 F
2 F
3 F
4 M
..
886 M
887 F
888 F
889 M
890 M
Name: Sex_short, Length: 891, dtype: object
只要用replace函数即可替代了原来的字母,构建一个映射函数。它需要字典类型,构造映射关系。
当然,字符串也有替换函数,但是字符替换,需要多次使用,可是顺序颠倒了,可能你拿不到需要的效果。切记,切记!
titanic["Sex_short"] = titanic["Sex"].str.replace("female", "F")
titanic["Sex_short"] = titanic["Sex_short"].str.replace("male", "M")
以上代码只是一个简单示例,示例代码中的表达式可以根据实际问题进行修改。
觉得有用 收藏 收藏 收藏
点个赞 点个赞 点个赞
End
GPT专栏文章:
GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案
GPT实战系列-LangChain + ChatGLM3构建天气查询助手
大模型查询工具助手之股票免费查询接口
GPT实战系列-简单聊聊LangChain
GPT实战系列-大模型为我所用之借用ChatGLM3构建查询助手
GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(二)
GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)
GPT实战系列-ChatGLM2模型的微调训练参数解读
GPT实战系列-如何用自己数据微调ChatGLM2模型训练
GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案
GPT实战系列-Baichuan2本地化部署实战方案
GPT实战系列-Baichuan2等大模型的计算精度与量化
GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF
GPT实战系列-探究GPT等大模型的文本生成-CSDN博客