Pandas實現資料類型轉換的一些技巧
這篇文章主要介紹了關於Pandas實現資料類型轉換的一些技巧,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
前言
Pandas是Python當中重要的資料分析工具,利用Pandas進行資料分析時,確保使用正確的資料類型是非常重要的,否則可能會導致一些不可預測的錯誤發生。
Pandas 的資料類型:資料類型本質上是程式語言用來理解如何儲存和操作資料的內部結構。例如,一個程式需要理解你可以將兩個數字加起來,例如 5 10 得到 15。或者,如果是兩個字串,例如“cat”和“hat”,你可以將它們連接(加)起來得到“cathat”。尚學堂•百戰程式設計師陳老師指出有關 Pandas 資料類型的一個可能令人困惑的地方是,Pandas、Python 和 numpy 的資料類型之間有一些重疊。
大多數情況下,你不必擔心是否應該明確地將熊貓類型強制轉換為對應的 NumPy 類型。一般來說使用 Pandas 的預設 int64 和 float64 就可以。我列出此表的唯一原因是,有時你可能會在程式碼行間或自己的分析過程中看到 Numpy 的類型。
資料類型是在你遇到錯誤或意外結果之前並不會關心的事情之一。不過當你將新資料載入到 Pandas 進行進一步分析時,這也是你應該檢查的第一件事情。
筆者使用Pandas已經有一段時間了,但是還是會在一些小問題上犯錯誤,追根溯源發現在對資料進行操作時某些特徵列並不是Pandas所能處理的類型。因此本文將討論一些小技巧如何將Python的基本資料類型轉化為Pandas所能處理的資料類型。
Pandas、Numpy、Python各自支援的資料型別
從上述表格中可以看出Pandas支援的資料類型最為豐富,在某種情形下Numpy的資料類型可以和Pandas的資料類型相互轉化,畢竟Pandas函式庫是在Numpy的基礎之上開發的。
引入實際資料進行分析
資料類型是你平常可能不太關心,直到得到了錯誤的結果才映像深刻的東西,因此在這裡引入一個實際數據分析的例子來加深理解。
import numpy as np import pandas as pd data = pd.read_csv('data.csv', encoding='gbk') #因为数据中含有中文数据 data
#資料載入完畢,如果現在想要在該資料上進行一些操作,例如把數據列2016、2017對應項相加。
data['2016'] data['2017'] #想當然的做法
從結果來看並沒有像想像中那樣數值對應相加,這是因為在Pandas中object型別相加等價於Python中的字串相加。
data.info() #在對資料進行處理之前應該先查看載入資料的相關資訊
在看到載入資料的相關資訊後可以發現以下幾個問題:
客戶編號的資料型別是int64而不是object型別
- ##2016、2017列的資料型別是object而不是數值型別(int64、float64)
- 成長率、所屬群組的資料型別應該為數值型別而不是object型別
- year、month、day的資料型別應該是datetime64型別而不是object型別
- Pandas中進行資料型別轉換有三種基本方法:
- 使用astype()函數進行強制型別轉換
- #自訂函數進行資料型別轉換
- 使用Pandas提供的函數如to_numeric()、to_datetime()
#使用astype()函數進行型別轉換
#對資料列進行資料型別轉換最簡單的方法就是使用astype()函數
data['客户编号'].astype('object') data['客户编号'] = data['客户编号'].astype('object') #对原始数据进行转换并覆盖原始数据列
上面的結果來看起來很不錯,接下來給幾個astype()函數作用於列資料但失效的範例
##
data['2017'].astype('float')
data['所属组'].astype('int')
从上面两个例子可以看出,当待转换列中含有不能转换的特殊值时(例子中¥,ErrorValue等)astype()函数将失效。有些时候astype()函数执行成功了也并不一定代表着执行结果符合预期(神坑!)
data['状态'].astype('bool')
乍一看,结果看起来不错,但仔细观察后,会发现一个大问题。那就是所有的值都被替换为True了,但是该列中包含好几个N标志,所以astype()函数在该列也是失效的。
总结一下astype()函数有效的情形:
数据列中的每一个单位都能简单的解释为数字(2, 2.12等)
数据列中的每一个单位都是数值类型且向字符串object类型转换
如果数据中含有缺失值、特殊字符astype()函数可能失效。
使用自定义函数进行数据类型转换
该方法特别适用于待转换数据列的数据较为复杂的情形,可以通过构建一个函数应用于数据列的每一个数据,并将其转换为适合的数据类型。
对于上述数据中的货币,需要将它转换为float类型,因此可以写一个转换函数:
def convert_currency(value): """ 转换字符串数字为float类型 - 移除 ¥ , - 转化为float类型 """ new_value = value.replace(',', '').replace('¥', '') return np.float(new_value)
现在可以使用Pandas的apply函数通过covert_currency函数应用于2016列中的所有数据中。
data['2016'].apply(convert_currency)
该列所有的数据都转换成对应的数值类型了,因此可以对该列数据进行常见的数学操作了。如果利用lambda表达式改写一下代码,可能会比较简洁但是对新手不太友好。
data['2016'].apply(lambda x: x.replace('¥', '').replace(',', '')).astype('float')
当函数需要重复应用于多个列时,个人推荐使用第一种方法,先定义函数还有一个好处就是可以搭配read_csv()函数使用(后面介绍)。
#2016、2017列完整的转换代码 data['2016'] = data['2016'].apply(convert_currency) data['2017'] = data['2017'].apply(convert_currency)
同样的方法运用于增长率,首先构建自定义函数
def convert_percent(value): """ 转换字符串百分数为float类型小数 - 移除 % - 除以100转换为小数 """ new_value = value.replace('%', '') return float(new_value) / 100
使用Pandas的apply函数通过covert_percent函数应用于增长率列中的所有数据中。
data['增长率'].apply(convert_percent)
使用lambda表达式:
data['增长率'].apply(lambda x: x.replace('%', '')).astype('float') / 100
结果都相同:
为了转换状态列,可以使用Numpy中的where函数,把值为Y的映射成True,其他值全部映射成False。
data['状态'] = np.where(data['状态'] == 'Y', True, False)
同样的你也可以使用自定义函数或者使用lambda表达式,这些方法都可以完美的解决这个问题,这里只是多提供一种思路。
利用Pandas的一些辅助函数进行类型转换
Pandas的astype()函数和复杂的自定函数之间有一个中间段,那就是Pandas的一些辅助函数。这些辅助函数对于某些特定数据类型的转换非常有用(如to_numeric()、to_datetime())。所属组数据列中包含一个非数值,用astype()转换出现了错误,然而用to_numeric()函数处理就优雅很多。
pd.to_numeric(data['所属组'], errors='coerce').fillna(0)
可以看到,非数值被替换成0.0了,当然这个填充值是可以选择的,具体文档见
pandas.to_numeric - pandas 0.22.0 documentation
Pandas中的to_datetime()函数可以把单独的year、month、day三列合并成一个单独的时间戳。
pd.to_datetime(data[['day', 'month', 'year']])
完成数据列的替换
data['new_date'] = pd.to_datetime(data[['day', 'month', 'year']]) #新产生的一列数据 data['所属组'] = pd.to_numeric(data['所属组'], errors='coerce').fillna(0)
到这里所有的数据列都转换完毕,最终的数据显示:
在读取数据时就对数据类型进行转换,一步到位
data2 = pd.read_csv("data.csv", converters={ '客户编号': str, '2016': convert_currency, '2017': convert_currency, '增长率': convert_percent, '所属组': lambda x: pd.to_numeric(x, errors='coerce'), '状态': lambda x: np.where(x == "Y", True, False) }, encoding='gbk')
在这里也体现了使用自定义函数比lambda表达式要方便很多。(大部分情况下lambda还是很简洁的,笔者自己也很喜欢使用)
總結
對資料集進行操作的第一步是確保設定正確的資料類型,然後才能進行資料的分析、視覺化等操作,Pandas提供了很多非常方便的函數,有了這些函數那麼對資料進行分析將會是很方便的。
相關推薦:
以上是Pandas實現資料類型轉換的一些技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

全角英文字母轉換為半角形式的實用技巧在現代生活中,我們經常會接觸到英文字母,在使用電腦、手機等設備時也經常需要輸入英文字母。然而,有時候我們會遇到全角英文字母的情況,而我們需要使用的是半角形式。那麼,如何將全角英文字母轉換為半角形式呢?以下就為大家介紹一些實用的技巧。首先,全角英文字母和數字是指在輸入法中佔據一個全角位置的字符,而半角英文字母和數字則是佔據一

在這篇文章中,我們將向您展示如何將OpenDocumentTextDocument(ODT)檔案轉換為MicrosoftWord(Docx、DOC等)。格式。如何在Windows11/10中將ODT轉換為Word以下是您可以在WindowsPC上將ODT文件轉換為DOC或DOCX格式的方法:使用寫字板或Word將ODT轉換為Word我們要向您展示的第一種方法是使用寫字板或MicrosoftWord將ODT轉換為Word。以下是實現這一點的步驟:首先,使用「開始」功能表開啟寫字板應用程式。現在,轉到

Golang時間轉換:如何將時間戳轉換為字串在Golang中,時間操作是非常常見的操作之一。有時候我們需要將時間戳記轉換為字串,以便於展示或儲存。本文將介紹如何使用Golang將時間戳轉換為字串,並提供具體的程式碼範例。 1.時間戳和字串的轉換在Golang中,時間戳通常是以整數數字的形式表示的,表示的是從1970年1月1日至當前時間的秒數。而字串則

這篇文章將詳細介紹如何將PHP中的月份轉換為英文月份的方法,同時給出具體的程式碼範例。在PHP開發中,有時候我們需要將數字表示的月份轉換為英文的月份,這在一些日期處理或資料展示的場景下非常實用。以下將從實作原理、具體程式碼範例和注意事項等方面進行詳解。一、實作原理在PHP中,可以透過使用DateTime類別和format方法來實現將數位月份轉換為英文月份。 Date

簡易pandas安裝教學:詳細指導如何在不同作業系統上安裝pandas,需要具體程式碼範例隨著資料處理和分析的需求不斷增加,pandas成為了許多資料科學家和分析師們的首選工具之一。 pandas是一個強大的資料處理和分析庫,可以輕鬆處理和分析大量結構化資料。本文將詳細介紹如何在不同作業系統上安裝pandas,以及提供具體的程式碼範例。在Windows作業系統上安

qq音樂讓大家盡情享受觀影解悶,每天都可以使用這個軟體,輕鬆滿足自己的使用,優質海量的歌曲,任由大家暢聽,也可以下載保存起來,下次聽的時候,不需要網絡,而在這裡下載的歌曲不是MP3格式的,無法在其他平台使用,會員歌曲過期後也沒有辦法再聽了,所以很多小伙伴們,都想要將歌曲轉換成MP3格式的,在這裡小編為你們提供方法,幫助大家都可以使用起來! 1、開啟電腦qq音樂,點選右上角【主選單】按鈕,點選【音訊轉碼】,選擇【新增歌曲】選項,新增需要轉換的歌曲; 2、新增歌曲完畢,點選選擇轉換為【mp3

全角英文字母變成半角字母的方法在日常生活和工作中,有時候我們會遇到需要將全角英文字母轉換為半角字母的情況,例如在輸入電腦密碼、編輯文件或設計排版時。全角英文字母和數字是指寬度與中文字符相同的字符,而半角英文字母則是指寬度較窄的字符。在實際操作中,我們需要掌握一些簡單的方法,將全角英文字母轉換為半角字母,以便更方便地處理文字和數字。一、全角英文字母與半角英

PHP教學:如何將int型別轉換為字串在PHP中,將整型資料轉換為字串是常見的操作。本教學將介紹如何使用PHP內建的函數將int型別轉換為字串,同時提供具體的程式碼範例。使用強制型別轉換:在PHP中,可以使用強制型別轉換的方式將整型資料轉換為字串。這種方法非常簡單,只需要在整型資料前加上(string)即可將其轉換為字串。下面是一個簡單的範例程式碼
