30 個 Python 技巧,加速你的數據分析處理速度

来源:https://www.cnblogs.com/liuyebai/archive/2022/10/22/16806721.html
-Advertisement-
Play Games

pandas的下載 使用命令下載: pip install pandas 或者自行下載whl文件安裝 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 創建DataFrame數據 pd_data = pd.DataFrame({ "name":["小明","小紅 ...


pandas的下載

 

使用命令下載:

pip install pandas 

 

 

或者自行下載whl文件安裝

https://www.lfd.uci.edu/~gohlke/pythonlibs/

 

 

創建DataFrame數據

pd_data = pd.DataFrame({
    "name":["小明","小紅","小孫","王小","關宇","劉蓓","張菲"],
    "age":[20,18,27,20,28,18,25],
    "sex":["","","","","","",""],
    "score":[669,570,642,590,601,619,701],
    "address":["北京","深圳","廣州","武漢","深圳","廣州","長沙"]
})

print(pd_data)

 

讀取本地文件

 

pd_data = pd.read_excel('./測試.xlsx')

pd.set_option('display.max_columns', None)   # 顯示完整的列
pd.set_option('display.max_rows', None)  # 顯示完整的行
pd.set_option('display.expand_frame_repr', False)  # 設置不摺疊數據

print(pd_data)

 

 

查看數據是否有缺失

# 如果缺失顯示為True,否則顯示False
isnull = pd_data.isnull()        
print(isnull)

 

 

統計缺失值個數

# 統計缺失值個數
null_count = pd_data.isnull().sum()
print(null_count)

 

 

缺失值填充

# 填充數據 我選擇了8.888,你隨意
pd_data.fillna(8.888, inplace=True)
print(pd_data)

 

 

缺失值刪除

# 如果有缺失值,刪除此行
exist_col = pd_data.dropna()
print(exist_col)

 

 

查看頭尾文件

# 查看頭尾文件
print('頭文件:', pd_data.head())
print('尾文件:', pd_data.tail())

 

 

取單列值

# 單列值
pd_data = pd.read_excel('./測試.xlsx')
print(pd_data['全款價'])

 

 

取多列值

# 多列值
pd_data = pd.read_excel('./測試.xlsx')
print(pd_data[['車輛概況', '全款價']])

 

 

單條件取值

pd_data = pd.read_excel('./測試.xlsx')
print(pd_data[pd_data['全款價'] == 4])
print('-'*100)
print(pd_data[pd_data['汽車排量'] == '2.0T'])

 

 

多條件取值-與

# 多條件篩選數據
print(pd_data[(pd_data['車齡'] == '2018年') & (pd_data['變速箱'] == '自動')])

 

 

多條件取值-或

# 多條件篩選數據
print(pd_data[(pd_data['車齡'] == '2018年') | (pd_data['變速箱'] == '自動')])

 

 

字元串的開始函數

# 找出在 車輛概況 中以'大眾'開頭的
cars = pd_data[pd_data['車輛概況'].str.startswith('大眾')]
print(cars)

 

 

字元串的結尾函數

# 找出在 車輛概況 中以'豪華型'結尾的
cars = pd_data[pd_data['車輛概況'].str.endswith('豪華型')]
print(cars)

 

字元串的包含函數‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

# 找出在 車輛概況 中包含'進口'的
cars = pd_data[pd_data['車輛概況'].str.contains('進口')]
print(cars)

統計元素個數

# 統計 過戶分類 以及對應次數
trans_count = pd_data['過戶情況'].value_counts()
print(trans_count)

 

 

為了便於進一步的數據分析,我希望將它們置於不同的數組之中,可以採用如下方法:

# 統計 過戶分類 以及對應次數
trans_count = pd_data['過戶情況'].value_counts()
# 針對於過戶情況的分類
x1_data = trans_count.index.tolist()    
# 分類後各組數據的統計
x2_data = trans_count.tolist()      

print(x1_data)
print(x2_data)

這種格式的數據才是最適合做可視化分析的!

這裡再多介紹兩種方法,條條大路通羅馬

都能輕鬆實現你的目標。

# 統計 過戶分類 以及對應次數
trans_count = pd_data['過戶情況'].value_counts()
# 針對於過戶情況的分類
x1_data = trans_count.index.tolist()
x11_data = trans_count.index
x12_data = trans_count.index.values
# 類後各組數據的統計
x2_data = trans_count.tolist()
print('index.tolist():', x1_data)
print('index:', x11_data)
print('index.values:', x12_data)
print('x2:', x2_data)

 

 

分割字元串

這個功能也很實用,大家可以看看我的汽車名稱數據這一列,我的目標僅僅是車名而已,後面的車型、車齡、排列、變速箱信息對我來說都是冗餘信息。

非常不利於我後續數據可視化

所以字元串分割在這裡就顯得尤為重要。

 

 

# 對 汽車名稱 這一列按照空格分割 並取第一個字元
pd_data['汽車名稱'] = pd_data['車輛概況'].map(lambda x: x.split(" ")[0])
name = pd_data['汽車名稱'].value_counts()
# 汽車名稱分類
name1 = name.index.tolist()  
# 汽車名稱對應數量
name2 = name.tolist()  
print(name1)
print(name2)

 

 

看到我取出來數據的樣子了嗎,要的就是這個!

清理數據

當我們相對汽車裡程做進一步的分析時會發現數據後面都有一個’萬公裡’,這種數據要做可視化必須先對數據進行處理,

就是先要去除數字後面的字元


 

 

我們可以使用字元串的replace()方法,使用空格替換字元

 

pd_data.loc[:, '表顯里程new'] = pd_data['表顯里程'].str.replace('萬公裡', '').astype('float32')  # 去除 30 ’萬公裡‘
# 保存數據
pd_data.to_excel('測試1.xlsx')

 

 

黃色一列是我們處理之前的數據

綠色一列是我們處理之後的數據

已經達到了我們想要的效果

 

 

劃分區間

現在有這麼一個需求,我想要按照汽車的行駛里程分類,基本上每個車的行駛里程都是不一樣的,如果將每個數據都反映在圖標上就會看起來很冗餘,

也就失去了作圖的意義

所以我們可以按照區間來劃分,例如5w-10w公裡、10w-15w公裡這樣圖表展示展示出來的效果就會很好了。

 

 

pd_data.loc[:, '表顯里程new'] = pd_data['表顯里程'].str.replace('萬公裡', '').astype('float32')  # 去除 30 ’萬公裡‘
# 劃分區間
pd_data['里程區間'] = pd.cut(pd_data['表顯里程new'], [0, 2, 4, 6, 8, 10, 20],
                             labels=['0-2', '2-4', '4-6', '6-8', '8-10', '>10'])
mile = pd_data['里程區間'].value_counts()
mile1 = mile.index.tolist()         # 里程區間分類
mile2 = mile.tolist()               # 里程區間分類對應數量
print(mile1)
print(mile2)

 

 

重置索引

其實我們在上面案例的演示中已經發現了,根據條件取出來的數據的索引都是處理數據之前的索引,

我們現在要重置索引的話要怎麼辦呢?

我們可是使用_reset_index()_來索引重置

重置索引前:

# 找出在 過戶情況 中所有'0次'的汽車
cars = pd_data[pd_data['過戶情況'].str.contains('0次')]
print(cars.reset_index())

 

 

重置索引後:

 

 

 

很好,但是不完美。多了一列colm name叫做 index的先前序列號。

 

不想看到它,有辦法嗎?

 

drop = True

# 找出在 過戶情況 中所有'0次'的汽車
cars = pd_data[pd_data['過戶情況'].str.contains('0次')]
print(cars.reset_index(drop=True))

 

 

 

column重命名

# 重命名
pd_data = pd_data.rename(columns = {'車輛概況':'車輛詳情'})
print(pd_data)

 

 

分組統計groupby-單條件

# 統計不同變速箱總里程
pd_data.loc[:, '表顯里程new'] = pd_data['表顯里程'].str.replace('萬公裡', '').astype('float32')    # 去除 30 ’萬公裡‘
trans_mile = pd_data.groupby('變速箱')['表顯里程new'].sum()
print(trans_mile)

 

 

分組統計groupby-多條件

# 統計不同變速箱和過戶情況總里程
pd_data.loc[:, '表顯里程new'] = pd_data['表顯里程'].str.replace('萬公裡', '').astype('float32')    # 去除 30 ’萬公裡‘
trans_mile = pd_data.groupby(['變速箱','過戶情況'])['表顯里程new'].sum()
print(trans_mile)

 

 

如果再加上一個重置索引 trans_mile.reset_index()

 

 

 

求平均

# 統計不同過戶次數車輛平均里程
pd_data.loc[:, '表顯里程new'] = pd_data['表顯里程'].str.replace('萬公裡', '').astype('float32')    # 去除 30 ’萬公裡‘
trans_mile = pd_data.groupby('過戶情況')['表顯里程new'].mean()
print(trans_mile.reset_index())

 

 

apply函數

還記得我們爬取大學的那個教程嗎?

我們爬出來的數據如果是985或者是211顯示為1,

如果非985或者211,顯示為2

 

 

現在我不想要1和2了,因為我看不懂它是什麼意思?如果是985或者211,就顯示是,如果不是,就顯示否!

pd_data = pd.read_excel('./全國高校數據.xlsx')
print(pd_data)
pd_data1 = pd_data.copy()  # 生成一個副本, 防止數據損壞
pd_data['f985'] = pd_data['f985'].apply(lambda x: '' if x == 1 else '')       # 通過匿名函數解決
pd_data['f211'] = pd_data['f985'].apply(lambda x: '' if x == 1 else '')       # 通過匿名函數解決
print(pd_data)

 

 

同理利用_lambda_函數我們還可以

給省份這一列後面加個’省’

pd_data = pd.read_excel('./全國高校數據.xlsx')
print(pd_data)
pd_data1 = pd_data.copy()  # 生成一個副本, 防止數據損壞

pd_data['province_name'] = pd_data['province_name'].apply(lambda x: x+'')       # 通過匿名函數解決
print(pd_data)
'''

 

 

同理利用_lambda_函數我們還可以給

人氣值view_total這一列最後面的’w’

pd_data['view_total'] = pd_data['view_total'].apply(lambda x: x[:-1])       # 通過匿名函數解決
print(pd_data)

 

 

求最大最小值

max_view_total = pd_data[pd_data['view_total'] == pd_data['view_total'].max()]
print(max_view_total)

 

 

min_view_total = pd_data[pd_data['view_total'] == pd_data['view_total'].min()]
print(min_view_total)

 

 

時間提取

 

為了便於演示,我加上了一列 Date 選項,如下:

 

 

 

現在我們想提取其中的年份或者月份,我們可以使用 'DatetimeIndex’這個方法來實現。

pd_data = pd.read_excel('./全國高校數據.xlsx')
pd_data['year'] = pd.DatetimeIndex(pd_data['Date']).year
pd_data['month'] = pd.DatetimeIndex(pd_data['Date']).month
pd_data['day'] = pd.DatetimeIndex(pd_data['Date']).day
print(pd_data)

 

 

增加列

 

我想把剛纔的生成的年+月+日方法到前三列,可以使用insert()方法來實現

Year = pd.DatetimeIndex(pd_data['Date']).year
Month = pd.DatetimeIndex(pd_data['Date']).month
day = pd.DatetimeIndex(pd_data['Date']).day
pd_data.insert(0, 'Year', Year)
pd_data.insert(1, 'Month', Month)
pd_data.insert(2, 'day', day)
print(pd_data)

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、同源政策 跨域問題其實就是瀏覽器的同源策略造成的。同源策略限制了從同一個源載入的文檔或腳本如何與另一個源的資源進行交互。這是瀏覽器的一個用於隔離潛在惡意文件的重要的安全機制。同源指的是:協議、埠號、功能變數名稱必須一致。同源策略:protocol(協議)、domain(功能變數名稱)、port(埠)三者必須 ...
  • 題目描述:判斷字元串中重覆次數最多的字元 // 解決思路: // 1.判斷字元重覆的方法 // 創建空數組,利用鍵值對形式對每個字元進行計數 // 用到 採用for迴圈結合if判斷 對象[鍵] 是否有值,無則undefined // arr.charAt(i)取得arr中i索引號下的元素 // 2. ...
  • 你需要知道的4個資料庫擴展解決方案 你已經用一個直觀的、用戶友好的用戶界面啟動了你的應用程式。但是,如果你的應用程式遇到負載問題,這將使你的終端客戶在使用它時感到沮喪。很有可能問題不在應用程式內部,而是在資料庫。根據一項調查,38%的資料庫專業人員報告說資料庫停機是讓他們夜不能寐的重要問題。停機可能 ...
  • 背景 相信大家看到這個文章對消息伺服器已經不陌生了,筆者也是在平日無聊想著自己編寫一套關於RockerMQ 的消息灰度框架的時候,準備本地搭建一個RockerMQ服務環境時遇到了一個頭疼的問題。在執行RockerMQ官網的Topic創建的時候(sh bin/mqadmin updatetopic - ...
  • 前言 記憶體木馬,就是在記憶體中運行的木馬病毒,沒有代碼實體。記憶體木馬有著強隱蔽性,排查困難,殺不死(俗稱不死馬)的特點。 網路安全行業,有著很強的木桶效應。系統對抗黑帽,勝負取決於安全最薄弱的環節。黑帽對抗白帽,勝負取決於攻擊水平和和毀屍滅跡隱蔽的水平。 正文 本文不討論是由於任意文件上傳還是近源攻擊 ...
  • Spring Cloud Eureka源碼分析的筆記,針對多個方法都有記錄,主要是方便自己對源碼部分的追溯,包括裡面的亮點設計的總結與源碼分析 ...
  • 三大特性 封裝 利用抽象數據類型將數據和基於數據的操作封裝在一起,使其構成一個不可分割的獨立實體。數據被保護在抽象數據類型的內部,儘可能地隱藏內部的細節,只保留一些對外介面使之與外部發生聯繫。用戶無需知道對象內部的細節,但可以通過對象對外提供的介面來訪問該對象。 優點: 減少耦合: 可以獨立地開發、 ...
  • 寫在前面 Redis 是一種 NoSQL 資料庫,包含多種數據結構、支持網路、基於記憶體、可選持久性的鍵值對存儲資料庫,在我們的日常開發中會經常使用 Redis 來解決許多問題,比如排行榜、消息隊列系統、計數器 以及 緩存系統等。 在作為緩存使用時,不可避免的會遇到緩存穿透、緩存雪崩、緩存擊穿(熱點 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...