【Python自動化Excel】Python與pandas字元串操作

来源:https://www.cnblogs.com/wansq/archive/2022/03/31/16080208.html
-Advertisement-
Play Games

Python之所以能夠成為流行的數據分析語言,有一部分原因在於其簡潔易用的字元串處理能力。 Python的字元串對象封裝了很多開箱即用的內置方法,處理單個字元串時十分方便;對於Excel、csv等表格文件中整列的批量字元串操作,pandas庫也提供了簡潔高效的處理函數,幾乎與內置字元串函數一一對應。 ...


Python之所以能夠成為流行的數據分析語言,有一部分原因在於其簡潔易用的字元串處理能力。

Python的字元串對象封裝了很多開箱即用的內置方法,處理單個字元串時十分方便;對於Excel、csv等表格文件中整列的批量字元串操作,pandas庫也提供了簡潔高效的處理函數,幾乎與內置字元串函數一一對應。也就是說:

  • 單個字元串處理,用Python內置的字元串方法;

  • 表格整列的字元串處理,用pandas庫中的字元串函數;

本文就以常用的數據處理需求,來對比使用以上兩種方式的異同,從而加深對Pythonpandas字元串操作的理解。(本文所有數據都是為了演示用的假數據,切勿當真!)

主目錄)

一、替換(去除空格)

場景:在問卷收集的姓名欄位中,不少填寫者會誤輸入空格,造成數據匹配不一致的問題。

Python

names = '劉    備、關  羽、   張 飛、趙   雲、馬 超、黃 忠'
names = names.replace(' ','')
print(names)

output

劉備、關羽、張飛、趙雲、馬超、黃忠

pandas

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

output

pandas替換空格
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後效果
分列、合併、導出Excel後效果

三、切片:截取數據

字元串是由一個個字元組成的序列,在Python中可以直接對字元串進行切片操作,來進行截取數據。

如“XX市四季家園二區22幢203室”,可以看作是下圖中16個字元值組成的序列。而切片的語法是:

Python切片原理
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
image-20220330005403437

配合os.rename()便可以批量重命名。關鍵代碼如下

df.apply(lambda x: os.rename( path + x["文件名"], path + x["新文件名"]), axis=1)
批量重命名演示
批量重命名演示

五、正則表達式

遇到複雜的字元串處理需求時,Python有優勢就可以體現出來了。因為python和pandas有一個超強的字元串處理武器:正則表達式。正則表達式可以匹配字元串的格式特點,如電子郵箱的地址格式、網址的地址格式、電話號碼格式等。如何寫好正則表達式,這是一門精深的學問,本文介紹幾個正則表達式的常用案例,淺嘗輒止。

註:Python預設不支持正則表達式語法,而pandas直接支持正則表達式語法,這裡重點介紹pandas處理表格數據。

1.提取長度不一樣的小區名

思路:

  • 提取上面小區名,可以歸納一下地址中小區名的格式特點:蘇州市之後,幢號數字之前的中文字元

  • Seriesstr.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映射分類
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匹配映射

結語

本文演示的字元串操作:替換分列切片截取補齊數據正則表達式apply()函數常見於數據分析的數據清洗環節,替換分列切片截取在Excel中也很容易實現,正則表達式可以說是Python處理複雜字元串問題的一大利器,apply()函數可以實現自定義函數處理表格型的數據,十分靈活、威力巨大。由於篇幅有限,正則表達式apply()函數本文就點到為止,今後值得整理更多相關案例。

搜一搜

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介 Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。 服務端基於Spring Boot和Spring Cloud開發,打包後可以直接運行,不需要額外安 ...
  • 一、前言 眾所周知,Python 不是一種執行效率較高的語言。此外在任何語言中,迴圈都是一種非常消耗時間的操作。假如任意一種簡單的單步操作耗費的時間為 1 個單位,將此操作重覆執行上萬次,最終耗費的時間也將增長上萬倍。 while 和 for 是 Python 中常用的兩種實現迴圈的關鍵字,它們的運 ...
  • 前言 本片博客記錄快速創建springboot工程的兩種方式。一種是使用maven創建,一種是使用spring initializr創建。開發環境JDK1.8、IDEA、maven。 SpringBoot 優點 可快速構建spring應用 直接嵌入tomcat、jetty、undenrtow伺服器( ...
  • 大家好,我是棧長。 相信大家看到了昨天的 Spring 漏洞,嚴重級別僅為中等,不必慌張, 棧長沒想到的是,自這個月初 Spring Cloud Gateway 突發高危漏洞,現在 Spring Cloud 另外一個 Spring Cloud Function 模塊也淪陷了。。。 來看最新昨天 Sp ...
  • springboot微服務整合swagger3方法很簡單,下文會演示。但是在分散式項目中如果每個微服務都需要單獨的分開訪問獲取介面文檔就不方便了,本文將詳細講解springcloud gateway網關如何聚合統一管理swagger介面文檔。 先貼張整合後的效果圖(通過切換左上角的下拉視窗獲取每個微 ...
  • 如何才能寫好Python代碼?很多小伙伴都會問這樣的問題,今天這篇就來告訴大家怎樣寫好Python代碼。 程式設計的好與壞,早在我們青蔥歲月時就接觸過了,只是那是並不知道這竟如此重要。能夠立即改善程式設計、寫出“好”代碼的知識有以下幾點: •面向對象五個基本原則; •常見的三種架構; •繪圖; •起 ...
  • 大家好,我是棧長。 最近技術棧真是醉了,Log4j2 的核彈級漏洞剛告一段落,這個月初 Spring Cloud Gateway 又突發高危漏洞,現在連最要命的 Spring 框架也淪陷了。。。 棧長今天看到了一些安全機構發佈的相關漏洞通告,Spring 官方博客也發佈了漏洞聲明: 漏洞描述: 用戶 ...
  • 前言: 請各大網友尊重本人原創知識分享,謹記本人博客:南國以南i 上篇我們介紹到 保姆教程系列二、Nacos實現註冊中心 配置中心原理 一、 服務配置中心介紹 首先我們來看一下,微服務架構下關於配置文件的一些問題: 配置文件相對分散。在一個微服務架構下,配置文件會隨著微服務的增多變的越來越多,而且分 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...