数据分析-Pandas如何处理表格中的文本数据

数据分析-Pandas如何处理表格中的文本数据

数据分析和处理中,难免会遇到文本数据,比如人名,地名,还有其他的场景描述等等。金融数据,风控数据,营销数据等等,莫不如此。如何用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博客

你可能感兴趣的:(金融风控,数据分析,pandas,数据挖掘,字符数据处理,分割,搜索)