最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pandas數(shù)據(jù)類型自行變換及數(shù)據(jù)類型轉(zhuǎn)換失敗問題分析與解決

 更新時間:2023年06月21日 15:01:51   作者:肖永威  
這篇文章主要介紹了Pandas數(shù)據(jù)類型自行變換及數(shù)據(jù)類型轉(zhuǎn)換失敗問題分析與解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Pandas數(shù)據(jù)類型自行變換及數(shù)據(jù)類型轉(zhuǎn)換失敗

最近,在進(jìn)行數(shù)據(jù)處理過程中,頻繁使用Pandas進(jìn)行DataFrame關(guān)聯(lián)、合并、數(shù)據(jù)類型變換操作,當(dāng)?shù)阶詈髷?shù)據(jù)入庫(MongoDB)時,出現(xiàn)部分整型數(shù)據(jù)變成浮點型,以及時間轉(zhuǎn)字符串存儲時,偶爾出現(xiàn)少部分存儲為時間戳整型數(shù)據(jù)(也就是說偶爾出現(xiàn)時間轉(zhuǎn)換為字符串轉(zhuǎn)換失敗的情況),

如下圖所示。

1. 整型變浮點型情況

1.1. 問題情況再現(xiàn)

1.1.1. 空值情況

在DataFrame表間關(guān)聯(lián)(merge)、合并(concat)過程中,容易出現(xiàn)數(shù)據(jù)為空的情況,則其對應(yīng)的數(shù)據(jù)列將為float64。

import pandas as pd
df1 = pd.DataFrame({'yearmonth': ['202201','202202','202203'],
                   'monthnum': [1,2,3]})
df2 = pd.DataFrame({'yearmonth': ['202201','202202'],
                   'testint': [11,12]})
print('df2數(shù)據(jù)類型\n',df2.dtypes)
df = pd.merge(left=df1,right=df2,how='left',on=['yearmonth'])
print('連接合并后數(shù)據(jù)類型\n',df.dtypes)
df

運行程序輸出結(jié)果如下所示,“testint”列的數(shù)據(jù)類型由int64變成float64。

1.1.2. 正負(fù)無窮情況(除數(shù)為0)

在DataFrame表中,進(jìn)行數(shù)據(jù)計算過程中,如果出現(xiàn)除數(shù)為零,則表示為正負(fù)無窮,對應(yīng)的列為float64類型。

import pandas as pd
df1 = pd.DataFrame({'yearmonth': ['202201','202202','202203'],
                   'monthnum': [1,2,3]})
print('df1數(shù)據(jù)類型\n',df1.dtypes)
df1.loc[:,'monthnum'] = df1['monthnum']/0
print('除零后,df1數(shù)據(jù)類型\n',df1.dtypes)
df1

1.1.3. 讀取含有空值的數(shù)據(jù)源

以讀取簡單的csv數(shù)據(jù)文件為例:

import pandas as pd
df = pd.read_csv('nan.csv')
print('數(shù)據(jù)類型\n',df.dtypes)
df

數(shù)據(jù)表nan.csv中,B列有個空值,則讀取數(shù)據(jù)后,B列為float64類型。

1.2. 小結(jié)

對于DataFrame表,在數(shù)據(jù)處理過程中,如果出現(xiàn)空值(nan)、正負(fù)無窮(inf),pandas將轉(zhuǎn)換為默認(rèn)的float64數(shù)據(jù)類型。

1.3. 解決方案

在關(guān)鍵點,例如存儲、計算前,如有必要,按數(shù)據(jù)字典定義類型,強(qiáng)制統(tǒng)一轉(zhuǎn)換為定義類型。

注意:

  • 首先,把空值處理掉,例如填充0,或其他需要的值;
  • 如果,一列存在多種類型數(shù)據(jù),需要單獨處理,詳見后續(xù)介紹。

2. 時間類型轉(zhuǎn)字符串失敗情況

2.1. 關(guān)于pandas時間類型與整型、字符串型轉(zhuǎn)換

序號功能原數(shù)據(jù)類型目標(biāo)數(shù)據(jù)類型方法
1時間轉(zhuǎn)整型datetime[ns]int64df[‘列名’].astype(‘int64’)
2時間轉(zhuǎn)字符串datetime[ns]str(object)df[‘列名’].dt.strftime(‘%Y-%m-%d’)
3整型轉(zhuǎn)時間int64datetime[ns]df[‘列名’].astype(‘datetime64[ns]’)
4字符串轉(zhuǎn)時間str(object)datetime[ns]df[‘列名’]…astype(‘datetime64’)

其中:時間類型單個數(shù)據(jù)的類型為

<class 'pandas._libs.tslibs.timestamps.Timestamp'>

對象,其他為正常python數(shù)據(jù)類型,例如int、str等。

import pandas as pd
import time
df = pd.DataFrame({'yearmonth': ['202201','202202','202202'],
                   'monthnum': [1,2,1],
                   'datetime': [pd.Timestamp('2018-03-10 21:00:01'),pd.Timestamp('2019-03-10 12:02:00'),pd.Timestamp('2019-09-10 12:02:00')]})
df['datetimenum'] = df['datetime'].astype('int64')
df

df.loc[:,'datetimenum'] = df['datetimenum'].astype('datetime64[ns]')
df['datetimestr'] = df['datetime'].dt.strftime('%Y-%m-%d')
df.loc[:,'datetimestr'] = df['datetimestr'].astype('datetime64')

2.2. 單列復(fù)雜數(shù)據(jù)類型情況及解決方法

由于很難模擬出時間類型轉(zhuǎn)字符串失敗情況,文中僅僅采用按行強(qiáng)制賦值方式構(gòu)建分析樣本。

分別直接賦值整型時間戳和字符串時間,如下列所示。

df.loc[1,'datetimenum'] = 1611532800000
df.loc[2,'datetimestr'] = '2022-08-10'
df.dtypes
# 下面代碼報錯!
df.loc[:,'datetimenum'] = df['datetimenum'].astype('datetime64')
df.loc[:,'datetimenum'] = df['datetimenum'].astype('datetime64[ns]')

對于目標(biāo)為時間類型的列(本例中的datetimenum),如果某行存儲一個整型數(shù)據(jù),即使是時間戳整數(shù),這種混合情況,表現(xiàn)類型為“Object”,在類型轉(zhuǎn)換時將會報錯。

ValueError: mixed datetimes and integers in passed array

對于這種復(fù)雜混合類型的列,可以采用逐行按具體數(shù)據(jù)類型轉(zhuǎn)換到目標(biāo)類型,如下文把混合時間、字符串、時間戳整數(shù)的數(shù)據(jù)統(tǒng)一轉(zhuǎn)換為字符串類型。

import numpy as np
import time
def f(timeNum):
    if type(timeNum) == type(1):
        timeTemp = float(timeNum/1000)
        tupTime = time.localtime(timeTemp)
        #stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
        stadardTime = time.strftime("%Y-%m-%d", tupTime)
    elif type(timeNum) == type('2022-08-18'):
        stadardTime = timeNum
    else:
        print(type(timeNum))   
        #stadardTime = timeNum.strftime("%Y-%m-%d %H:%M:%S")
        stadardTime = timeNum.strftime("%Y-%m-%d")
    print(timeNum)
    return pd.Series([stadardTime])
df['datetimestr'] = df['datetimestr'].apply(lambda x:f(x))
df

2.3. 相關(guān)內(nèi)容,數(shù)據(jù)類型識別

Python中常用isinstance()和type()內(nèi)置函數(shù)判斷數(shù)據(jù)類型:

isinstance()是Python中的一個內(nèi)建函數(shù)。是用來判斷一個對象的變量類型。

isinstance(object, classinfo)
  • 如果參數(shù)object是classinfo的實例,或者object是classinfo類的子類的一個實例, 返回True。
  • 如果object不是一個給定類型的的對象, 則返回結(jié)果總是False。

type函數(shù)是Python的內(nèi)置函數(shù),返回參數(shù)的類型。

# type函數(shù)
variateint = 100
variatestr = '100'
if type(variateint) == type(1):
    print('int')
if type(variatestr) == type('hello'):
    print('str')
# isinstance函數(shù)
if isinstance(variateint,int):
    print('int')
if isinstance(variatestr,str):
    print('str')

補(bǔ)充:

type只接收一個參數(shù),不但可以判斷變量是否屬于某個類型,而且可以得到參數(shù)變量未知的所屬的類型;

而isinstance只能判斷是否屬于某個已知類型,不能直接得到變量未知的所屬的類型

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用python打印出菱形、三角形以及矩形的方法實例

    利用python打印出菱形、三角形以及矩形的方法實例

    最近在開發(fā)中遇到一個問題,需要利用python實現(xiàn)菱形、三角形以及矩形等形狀,發(fā)現(xiàn)網(wǎng)上這方面的資料較少,所以總結(jié)分享下,這篇文章主要給大家介紹了關(guān)于利用python打印出菱形、三角形以及矩形的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • Python 二叉樹的層序建立與三種遍歷實現(xiàn)詳解

    Python 二叉樹的層序建立與三種遍歷實現(xiàn)詳解

    這篇文章主要介紹了Python 二叉樹的層序建立與三種遍歷實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 使用IPython或Spyder將省略號表示的內(nèi)容完整輸出

    使用IPython或Spyder將省略號表示的內(nèi)容完整輸出

    這篇文章主要介紹了使用IPython或Spyder將省略號表示的內(nèi)容完整輸出,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • wxPython電子表格功能wx.grid實例教程

    wxPython電子表格功能wx.grid實例教程

    這篇文章主要介紹了wxPython電子表格功能wx.grid實例教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 詳細(xì)探究Python中的字典容器

    詳細(xì)探究Python中的字典容器

    這篇文章主要介紹了Python中的字典容器,本文來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • 解決df.to_csv()中文件名的問題

    解決df.to_csv()中文件名的問題

    這篇文章主要介紹了解決df.to_csv()中文件名的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Numpy維度知識總結(jié)

    Numpy維度知識總結(jié)

    這篇文章主要介紹了Numpy維度知識總結(jié),因為在numpy里一維既可以做行向量也可以做列向量,那對于任意一個給定的一維向量,我們就無法確定他到底是行向量還是列向量,為了防止這種尷尬的境地,習(xí)慣上用二維矩陣而不是一維矩陣來表示行向量和列向量,需要的朋友可以參考下
    2023-09-09
  • python 提取tuple類型值中json格式的key值方法

    python 提取tuple類型值中json格式的key值方法

    今天小編就為大家分享一篇python 提取tuple類型值中json格式的key值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python OpenCV學(xué)習(xí)筆記之繪制直方圖的方法

    python OpenCV學(xué)習(xí)筆記之繪制直方圖的方法

    本篇文章主要介紹了python OpenCV學(xué)習(xí)筆記之繪制直方圖的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • anaconda的安裝和配置環(huán)境及導(dǎo)入pycharm的方法

    anaconda的安裝和配置環(huán)境及導(dǎo)入pycharm的方法

    這篇文章主要介紹了anaconda的安裝和配置環(huán)境及導(dǎo)入pycharm的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

海伦市| 嫩江县| 扶余县| 铜川市| 聊城市| 韩城市| 东宁县| 临桂县| 固阳县| 陇西县| 南岸区| 山阳县| 珲春市| 内乡县| 梅州市| 台江县| 客服| 沭阳县| 丹巴县| 师宗县| 舟曲县| 乌什县| 临洮县| 凤凰县| 永顺县| 四川省| 沂源县| 泉州市| 牡丹江市| 乌拉特前旗| 磴口县| 新疆| 土默特右旗| 满城县| 浦北县| 文登市| 富锦市| 凤凰县| 新疆| 龙州县| 福安市|