欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pandas數據類型自行變換及數據類型轉換失敗問題分析與解決

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

Pandas數據類型自行變換及數據類型轉換失敗

最近,在進行數據處理過程中,頻繁使用Pandas進行DataFrame關聯、合并、數據類型變換操作,當到最后數據入庫(MongoDB)時,出現部分整型數據變成浮點型,以及時間轉字符串存儲時,偶爾出現少部分存儲為時間戳整型數據(也就是說偶爾出現時間轉換為字符串轉換失敗的情況),

如下圖所示。

1. 整型變浮點型情況

1.1. 問題情況再現

1.1.1. 空值情況

在DataFrame表間關聯(merge)、合并(concat)過程中,容易出現數據為空的情況,則其對應的數據列將為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數據類型\n',df2.dtypes)
df = pd.merge(left=df1,right=df2,how='left',on=['yearmonth'])
print('連接合并后數據類型\n',df.dtypes)
df

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

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

在DataFrame表中,進行數據計算過程中,如果出現除數為零,則表示為正負無窮,對應的列為float64類型。

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

1.1.3. 讀取含有空值的數據源

以讀取簡單的csv數據文件為例:

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

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

1.2. 小結

對于DataFrame表,在數據處理過程中,如果出現空值(nan)、正負無窮(inf),pandas將轉換為默認的float64數據類型。

1.3. 解決方案

在關鍵點,例如存儲、計算前,如有必要,按數據字典定義類型,強制統一轉換為定義類型。

注意:

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

2. 時間類型轉字符串失敗情況

2.1. 關于pandas時間類型與整型、字符串型轉換

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

其中:時間類型單個數據的類型為

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

對象,其他為正常python數據類型,例如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. 單列復雜數據類型情況及解決方法

由于很難模擬出時間類型轉字符串失敗情況,文中僅僅采用按行強制賦值方式構建分析樣本。

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

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]')

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

ValueError: mixed datetimes and integers in passed array

對于這種復雜混合類型的列,可以采用逐行按具體數據類型轉換到目標類型,如下文把混合時間、字符串、時間戳整數的數據統一轉換為字符串類型。

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. 相關內容,數據類型識別

Python中常用isinstance()和type()內置函數判斷數據類型:

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

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

type函數是Python的內置函數,返回參數的類型。

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

補充:

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

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

總結

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

相關文章

  • Python中map函數的技巧分享

    Python中map函數的技巧分享

    在Python中,map()是一個內置函數,這篇文章將從基礎的使用方法到高級的技巧,全面介紹Python中map()方法的使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-07-07
  • python-docx修改已存在的Word文檔的表格的字體格式方法

    python-docx修改已存在的Word文檔的表格的字體格式方法

    今天小編就為大家分享一篇python-docx修改已存在的Word文檔的表格的字體格式方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python機器學習NLP自然語言處理基本操作精確分詞

    Python機器學習NLP自然語言處理基本操作精確分詞

    本文是Python機器學習NLP自然語言處理系列文章,帶大家開啟一段學習自然語言處理 (NLP) 的旅程. 本文主要學習NLP自然語言處理基本操作之如何精確分詞
    2021-09-09
  • Python pathlib模塊使用方法及實例解析

    Python pathlib模塊使用方法及實例解析

    這篇文章主要介紹了Python pathlib模塊使用方法及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • python實現網站的模擬登錄

    python實現網站的模擬登錄

    這篇文章主要介紹了python實現網站的模擬登錄的相關資料,通過自己構造post數據來用Python實現登錄過程,需要的朋友可以參考下
    2016-01-01
  • python+pygame實現代碼雨(黑客帝國既視感)

    python+pygame實現代碼雨(黑客帝國既視感)

    這篇文章主要介紹了python+pygame實現代碼雨(黑客帝國既視感),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • django的model操作匯整詳解

    django的model操作匯整詳解

    這篇文章主要介紹了django的model操作匯整詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • idea如何配置python環(huán)境

    idea如何配置python環(huán)境

    在IDEA中配置Python環(huán)境的步驟包括:安裝Python解釋器、安裝Python插件、創(chuàng)建Python項目、配置Python解釋器
    2024-11-11
  • PyTorch中tensor.backward()函數的詳細介紹及功能實現

    PyTorch中tensor.backward()函數的詳細介紹及功能實現

    backward()?函數是PyTorch框架中自動求梯度功能的一部分,它負責執(zhí)行反向傳播算法以計算模型參數的梯度,這篇文章主要介紹了PyTorch中tensor.backward()函數的詳細介紹,需要的朋友可以參考下
    2024-02-02
  • 在Django框架中運行Python應用全攻略

    在Django框架中運行Python應用全攻略

    這篇文章主要介紹了在Django框架中運行Python應用全攻略,在這之前必須搭建好簡單的視圖和模版,接下來便是本文中所述的核心內容應用配置,需要的朋友可以參考下
    2015-07-07

最新評論