【Python自动化Excel】Python与pandas字符串操作

2023-11-17

Python之所以能够成为流行的数据分析语言,有一部分原因在于其简洁易用的字符串处理能力。

Python的字符串对象封装了很多开箱即用的内置方法,处理单个字符串时十分方便;对于Excel、csv等表格文件中整列的批量字符串操作,pandas库也提供了简洁高效的处理函数,几乎与内置字符串函数一一对应。也就是说:

  • 单个字符串处理,用Python内置的字符串方法;

  • 表格整列的字符串处理,用pandas库中的字符串函数;

本文就以常用的数据处理需求,来对比使用以上两种方式的异同,从而加深对 Python 和 pandas 字符串操作的理解。(本文所有数据都是为了演示用的假数据,切勿当真!)

)

一、替换(去除空格)

场景:在问卷收集的姓名字段中,不少填写者会误输入空格,造成数据匹配不一致的问题。

Python

names = '刘    备、关  羽、   张 飞、赵   云、马 超、黄 忠'
names = names.replace(' ','')
print(names)

output

刘备、关羽、张飞、赵云、马超、黄忠

pandas

df['姓名'] = df['姓名'].str.replace(' ','')

output

pandas替换空格

二、分列

场景:在问卷收集数据的时候,多选题的数据往往是带有分隔符的。在分类汇总前往往需要按分隔符进行分列。

问卷中多选数据导出

Python

hobbyStr = "足球┋排球┋羽毛球┋篮球"
hobbyList = hobbyStr.split('┋')

output

['足球', '排球', '羽毛球', '篮球']

pandas

# 利用split进行分列,expand = True 返回dataframe;expand=False返回Series
hobbyDf = df['爱好'].str.split('|', expand=True)
# 将hobbyDf 与 df安装索引合并
df2 = pd.merge(df, hobbyDf, how="left", left_index=True, right_index=True)

分列、合并、导出Excel后效果

三、切片:截取数据

字符串是由一个个字符组成的序列,在Python中可以直接对字符串进行切片操作,来进行截取数据。

如“XX市四季家园二区22幢203室”,可以看作是下图中16个字符值组成的序列。而切片的语法是:

Python切片原理

Python

addressStr = "XX市四季家园二区22幢203室"
print(f"城市:{addressStr[:3]}")
print(f"小区:{addressStr[3:9]}")

output

城市:XX市
小区:四季家园二区

pandas

  • 提取城市名称,由于城市名称的字数相同,可以直接切片截取前三个。

df["城市"] = df["地址"].str[:3]

提取城市

  • 提取小区名,稍有点复杂。因为小区名称长度是不一样长的。可以利用字符串处理的天花板: 正则表达式 。详细处理方法,见下文 五、正则表达式 示例1。

四、补齐数据

有时候,我们在电脑中按文件名排序的时候,你可能会遇到下面的情况:

数值排序和字符排序

在不同系统中,我们希望是按数值排序,但偏偏系统却是按字符排序的,如某些车载播放器中。比较好的解决方法就是在前面添加0,补齐数据位数。数据量大的时候,手动修改很麻烦,Python字符串处理的 zfill() 函数就可以解决这个问题。

Python

myStr = "1章节"
print(myStr.zfill(4))  # 整个字符串补齐到4位

output

01章节

pandas

df["新文件名"] = "第"+df["文件名"].str[1:].str.zfill(8)

image-20220330005403437

配合 os.rename() 便可以批量重命名。关键代码如下

df.apply(lambda x: os.rename( path + x["文件名"], path + x["新文件名"]), axis=1)

批量重命名演示

五、正则表达式

遇到复杂的字符串处理需求时,Python有优势就可以体现出来了。因为python和pandas有一个超强的字符串处理武器:正则表达式。正则表达式可以匹配字符串的格式特点,如电子邮箱的地址格式、网址的地址格式、电话号码格式等。如何写好正则表达式,这是一门精深的学问,本文介绍几个正则表达式的常用案例,浅尝辄止。

注:Python默认不支持正则表达式语法,而pandas直接支持正则表达式语法,这里重点介绍pandas处理表格数据。

1.提取长度不一样的小区名

思路:

  • 提取上面小区名,可以归纳一下地址中小区名的格式特点: 苏州市之后,幢号数字之前的中文字符 。

  • Series 的 str.extract() ,可用正则从字符数据中抽取匹配的数据;

## 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
pattern = r'苏州市([\u4e00-\u9fa5]+)[0-9]+幢'
df["小区"] = df["地址"].str.extract(pattern, expand=False)

提取小区名

2.提取几幢几室

思路:几幢几室,格式都是 数字+幢 和 数字+室

  • 数字可以用 [0-9] 或 \d 来匹配;

  • + 表示1个或多个。

pattern = r'([0-9]+)幢'
df["幢号"] = df["地址"].str.extract(pattern, expand=False)

pattern = r'(\d+)室'
df["室号"] = df["地址"].str.extract(pattern, expand=False)

提取幢号室号

六、apply函数

apply 函数:可以对 DateFrame 进行逐行或逐列进行处理。

1.增加一列,将幢号按照奇偶数分类

将幢号为奇数的为A区,偶数的为B区

# 定义处理的函数,共apply函数调用,传入的参数为一个Series对象
def my_func(series):
    if (series["幢号"]) % 2 != 0:
        return "A区"
    else:
        return "B区"

df["幢号分类"] = df.apply(my_func, axis=1)

上述代码中apply函数,有两个参数

  • 第一个参数:处理逻辑的函数名。主要传入名称,这里为 my_func ;

  • 第二个参数: axis = 1 ,表示按列处理。即传入的是每一行的 Series 。

output

apply映射分类

2.增加一列,字典映射

def my_func2(series):
    # 映射字典,key为小区名,value为小区称号
    my_dict = {
    '吉祥如意家园': '最佳好运小区', 
    '科技村': '最佳科创小区',
     '四季家园': '最佳风光小区', 
     '万象更新家园': '最佳风采小区',
    }
    # 每一行小区名称,切片截取至倒数第2个,即-2
    nameKey = series['小区'][:-2]
    return my_dict[nameKey]

df["小区称号"] = df.apply(my_func2, axis=1)

output

apply匹配映射

结语

本文演示的字符串操作: 替换 、 分列 、 切片截取 、 补齐数据 、 正则表达式 、 apply()函数 常见于数据分析的数据清洗环节, 替换 、 分列 、 切片截取 在Excel中也很容易实现, 正则表达式 可以说是Python处理复杂字符串问题的一大利器, apply()函数 可以实现 自定义函数 处理表格型的数据,十分灵活、威力巨大。由于篇幅有限, 正则表达式 、 apply()函数 本文就点到为止,今后值得整理更多相关案例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python自动化Excel】Python与pandas字符串操作 的相关文章

  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • 在 python 3 中使用子进程

    我使用 subprocess 模块在 python 3 中运行 shell 命令 这是我的代码 import subprocess filename somename py in practical i m using a real fil
  • cv2.drawContours() - 取消填充字符内的圆圈(Python,OpenCV)

    根据 Silencer的建议 我使用了他发布的代码here https stackoverflow com questions 48244328 copy shape to blank canvas opencv python 482465
  • Pandas dataframe:每批行的操作

    我有一个熊猫数据框df我想计算每批行的一些统计信息 例如 假设我有一个batch size 200000 对于每批batch sizerows 我想要一列的唯一值的数量ID我的数据框 我怎样才能做这样的事情呢 这是我想要的一个例子 prin
  • 如何在VIM中设置文件的正确路径?

    每当我击中 pwd在 vim 中命令总是返回路径C Windows system32 即使我在桌面上的 Python 文件中 所以每当我跑步时 python 命令返回 python can t open file Users myname
  • 根据 Pandas 中的列表对多列进行排序

    感谢有关如何根据 pandas 中的倍数列表对给定多列进行排序的任何提示 如下所示 import pandas as pd sort a a d e sort b s1 s3 s6 sort c t1 t2 t3 df pd DataFra
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • ValueError:不支持连续[重复]

    这个问题在这里已经有答案了 我正在使用 GridSearchCV 进行线性回归的交叉验证 不是分类器也不是逻辑回归 我还使用 StandardScaler 对 X 进行标准化 我的数据框有 17 个特征 X 和 5 个目标 y 观察 约11
  • CNTK 抱怨 LSTM 中的动态轴

    我正在尝试在 CNTK 中实现 LSTM 使用 Python 来对序列进行分类 Input 特征是固定长度的数字序列 时间序列 标签是 one hot 值的向量 Network input input variable input dim
  • 在相同任务上,Keras 比 TensorFlow 慢

    我正在使用 Python 运行斩首 DCNN 本例中为 Inception V3 来获取图像特征 我使用的是 Anaconda Py3 6 和 Windows7 使用 TensorFlow 时 我将会话保存在变量中 感谢 jdehesa 并
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • 如何在 Django 中使用基于类的视图创建注册视图?

    当我开始使用 Django 时 我几乎使用 FBV 基于函数的视图 来处理所有事情 包括注册新用户 但当我更深入地研究项目时 我意识到基于类的视图通常更适合大型项目 因为它们更干净且可维护 但这并不是说 FBV 不是 无论如何 我将整个项目
  • Excels COUNTIFS 函数中的数组作为条件,混合 AND 和 OR [重复]

    这个问题在这里已经有答案了 我已经在谷歌上搜索了一段时间 但似乎无法让它发挥作用 我使用 Excel 2010 希望混合使用 AND 和 OR 运算符来计算行数 我想做的是这样的 COUNTIFS A A string1 B B strin
  • Flask 应用程序的测试覆盖率不起作用

    您好 想在终端的 Flask 应用程序中测试 删除路由 我可以看到测试已经过去 它说 test user delete test app LayoutTestCase ok 但是当我打开封面时 它仍然是红色的 这意味着没有覆盖它 请有人向我
  • Python对象初始化性能

    我只是做了一些快速的性能测试 我注意到一般情况下初始化列表比显式初始化列表慢大约四到六倍 这些可能是错误的术语 我不确定这里的行话 例如 gt gt gt import timeit gt gt gt print timeit timeit
  • PIL - 需要抖动,但限制调色板会导致问题

    我是 Python 新手 正在尝试使用 PIL 来执行 Arduino 项目所需的解析任务 这个问题涉及到Image convert 方法以及调色板 抖动等选项 我有一些硬件能够一次仅显示 16 种颜色的图像 但它们可以指定为 RGB 三元
  • 附加两个具有相同列、不同顺序的数据框

    我有两个熊猫数据框 noclickDF DataFrame 0 123 321 0 1543 432 columns click id location clickDF DataFrame 1 123 421 1 1543 436 colu
  • 导入错误:无法导入名称“时间戳”

    我使用以下代码在 python 3 6 3 中成功安装了 ggplot conda install c conda forge ggplot 但是当我使用下面的代码将其导入笔记本时 出现错误 from ggplot import Impor
  • 如何使用Python保存“完整的网页”而不仅仅是基本的html

    我正在使用以下代码来使用 Python 保存网页 import urllib import sys from bs4 import BeautifulSoup url http www vodafone de privat tarife r
  • 使用Multiprocessing和Pool时如何访问全局变量?

    我试图避免将变量冗余地传递到dataList e g 1 globalDict 2 globalDict 3 globalDict 并在全球范围内使用它们 global globalDict然而 在下面的代码中并不是这样做的解决方案 是否有

随机推荐

  • applicationContext.xml解析

  • 单点登录--cookie技术实现

    第一种为自己实现的单点登录 未使用CAS 主要是cookie跨域实现 代码如下 package com bochy filter import java io IOException import java security NoSuchA
  • 多媒体技术复习题

    多媒体技术复习题 一 选择题 1 所谓媒体是指 b A 二进制代码 B 表示和传播信息的载体 C 计算机输入与输出的信息 D 计算机屏幕显示的信息 2 帧频率为25帧 秒的电视制式有 b A PAL NTSC B PAL SECAM C S
  • SURF算法原理

    1 先对图像进行高斯滤波 2 选用二阶标准高斯函数作为滤波器 通过特定核间的卷积计算二阶偏导数 计算出Hessian矩阵 3 计算判别式的值 根据判别式取值的正负 来判断该点是不是极值点 4 利用非极大值抑制初步确定的特征点 5 精确定位极
  • STM32单片机PT100温度采集控制系统

    实践制作DIY GC0030 PT100温度采集控制系统 一 功能说明 基于STM32单片机设计 PT100温度采集控制系统 功能介绍 STM32F103C系列最小系统班 PT100温度传感器 LCD1602显示器 12mA恒流源电路 继电
  • Failed to resolve import “element-plus/lib/theme-chalk/index.css“ from “src\...

    Failed to resolve import element plus lib theme chalk index css from src 学习vue3 ts中遇到的问题 vue3 ts搭建参考掘金文章 很详细 希望我能早日学会这套东
  • 最小二乘法求解圆方程圆形及半径

    ci最小二乘法定义 摘抄于百度百科 基本思路 摘抄于百度百科 简单的来说 最小二乘法为一类线性算法 将需要求解的系数当作未知数 f x 与x当作已知数 通过多组对应关系求得系数的方法 所以 最小二乘法仅适合系数为一次项方程式 例如 k与b作
  • 贝叶斯软件genle教程_贝叶斯网络可视化软件GeNIe使用说明

    实例简介 详细的介绍了贝叶斯网络可视化软件GeNIe使用说明 适合初学者 Table of contents 3 1 Read me first 2 Hello gentel 13 3 Introduction 31 3 1 Guide t
  • js替换所有的回车换行符

    替换所有的回车换行 function TransferString content var string content try string string replace r n g br string string replace n
  • Intelij IDEA 配置Tomcat时找不到 “Application Server”

    由于公司突然断电 再打开idea的时候 tomcat就消失了 然后在网上搜了一下 没搜到自己乱点了一下 如图 plugins gt gt application servers View 是报红色 所以我在搜索栏搜索了tomcat 如果箭头
  • Java的replaceAll()方法

    replaceAll 方法实际是采用正则表达式的规则去匹配的 在regex中 表示一个 在java中一个 也要用 表示 这样 前一个 代表regex中的 后一个 代表java中的 所以字符串转义一次 正则转义一次 那么一个斜扛要写4个 1
  • R语言实现常用的5种分析方法(主成分+因子+多维标度+判别+聚类

    来源 R友舍 R语言多元分析系列之一 主成分分析 主成分分析 principal components analysis PCA 是一种分析 简化数据集的技术 它把原始数据变换到一个新的坐标系统中 使得任何数据投影的第一大方差在第一个坐标
  • linux下的qt可以调用脚本吗,QT下实现对Linux Shell调用的几种方法

    使用QProcess QThread include int main QProcess execute ls return 0 QProcess poc new QProcess poc gt start ping 222 207 53
  • vue学习 十七 Vue路由和http请求

    路由的实现 首先需要cmd将路由模块装上 然后重启项目 多打几遍就熟悉了npm run dev 在下面的黑窗口中 我之前已经装过了路由模块 显示如下 npm install vue router save dev npm run dev 然
  • 什么?到现在你还不知道什么是 访问修饰限定符吗?

    导航小助手 前言 一 public 访问修饰限定符 二 private 访问修饰限定符 三 default 访问修饰限定符 3 1 包的概念 3 2 导入包中的类 3 3 自定义包 3 4 包访问权限 3 5 常见的包 四 protecte
  • 4.人脸检测mtcnn+mobilenet戴口罩分类

    from keras models import Model Sequential import tensorflow as tf import numpy as np import cv2 import os from functools
  • Centos Linux系统配置SSH免密登录

    首先修改host 将需要互相免密的机器相互加入到host文件中 vi etc hostname 添加主机名 hadoop2 vi etc sysconfig network 添加IP和hostname对应关系 192 168 8 107 h
  • 基于 EMQX 和 Neuron 的工业物联网 MQTT Sparkplug 解决方案

    引言 Sparkplug 是基于 MQTT 的一种专门为工业自动化和物联网应用而设计的通信协议 要搭建 Sparkplug 解决方案 需要两个核心组件 一个是 MQTT Broker 负责消息的分发和管理 另一个是边缘节点 负责将本地设备接
  • Python机器学习之k-means聚类算法

    1 引言 所谓聚类 就是按照某个特定的标准将一个数据集划分成不同的多个类或者簇 使得同一个簇内的数据对象的相似性尽可能大 同时不再一个簇内的数据对象的差异性也尽可能大 聚类算法属于无监督学习算法的一种 k 均值聚类的目的是 把 n个点 可以
  • 【Python自动化Excel】Python与pandas字符串操作

    Python之所以能够成为流行的数据分析语言 有一部分原因在于其简洁易用的字符串处理能力 Python的字符串对象封装了很多开箱即用的内置方法 处理单个字符串时十分方便 对于Excel csv等表格文件中整列的批量字符串操作 pandas库