目錄
不同的數據類型可以用不同的處理方法。合適的數據類型,才能更高效處理數據。一個列只能有一個總數據類型,但具體值可以是不同的數據類型。源Excel文件pandas_dtypes.csv:

df = pd.read_csv(r"pandas_dtypes.csv")
df
df.dtypes
# Customer Number 列是float64,然而應該是int64
# 2016 2017兩列的數據是object,並不是float64或者int64格式
# Percent以及Jan Units 也是objects而不是數字格式
# Month,Day以及Year應該轉化為datetime64[ns]格式
# Active 列應該是布爾值
# 求2016和2017數據總和,兩列的數據類型為object,相加后不是想要的結果,而是得到一個更長的字符串
df['2016']+df['2017']
一、pandas、python、numpy數據類型對應關系
二、導入初始化指定
# 一次性指定所有列為object
df = pd.read_csv(r"pandas_dtypes.csv",dtype='object')
# 每個字段分別指定
df = pd.read_csv(r"pandas_dtypes.csv",dtype# ={'Customer Number': 'int64','Year':'int32'})
有些字段導入時無法指定想要的數據,比如無法將’2016‘和’2017‘這兩列字符型數據直接指定為數值型數據,必須經過一定的加工處理后才可以轉換(把$符號去掉)。
默認的數據類型是 int64 和 float64,文字類型是 object。
三、pandas智能推斷
再導入時,假若未指定數據類型,pandas會根據數據情況選擇合適的默認數據類型,避免數據發生缺失。導入后,也可以通過一些函數,智能推斷。
# 自動轉換合適的數據類型
df.convert_dtypes()
df.infer_objects()
四、常見方法——類型轉換 astype()
# 想要真正改變原始數據框,通常需要通過賦值來進行
df['Customer Number'] = df['Customer Number'].astype('int')
像2016,2017 Percent Growth,Jan Units 這幾列帶有特殊符號的object是不能直接通過astype('flaot')方法進行轉化的。這與python中的字符串轉化為浮點數,都要求原始的字符都只能含有數字本身,不能含有其他的特殊字符。
# 將Active列轉化為布爾值,五個結果全是True,不是想要的結果
df['Active'].astype('bool')
# 2016列中含有特殊字符$,無法直接轉換,直接報錯
df['2016'].astype('float')
astype()總結:
- 如果數據是純凈的數據,可以轉化為數字
- astype基本也就是兩種用作,數字轉化為單純字符串,單純數字的字符串轉化為數字,含有其他的非數字的字符串是不能通過astype進行轉化的。
- 需要引入其他的方法進行轉化,自定義函數方法
五、通過創建自定義的函數進行數據轉化
①apply()應用自定義函數
# 通過replace函數將$去掉,然后字符串轉化為浮點數,讓pandas選擇pandas認為合適的特定類型,float或者int,該例子中將數據轉化為了float64
# 通過pandas中的apply函數將2016列中的數據全部轉化
def convert_currency(var):
'''
convert the string number to a float
- 去除$
- 轉化為浮點數類型
'''
new_value = var.replace('$','')
return float(new_value)
df['2016'].apply(convert_currency)
②lambda函數
# 通過lambda 函數將這個比較簡單的函數一行帶過
df['2016'].apply(lambda x: x.replace('$','')).astype('float64')
# 同樣的,利用lambda表達式將PercentGrowth進行數據清理
df['Percent Growth'].apply(lambda x: x.replace('%','')).astype('float64')/100
③簡單內置函數
# 利用np.where() function 將Active 列轉化為布爾值
df['Active'] = np.where(df['Active']=='Y', True, False)
六、pandas提供的轉換函數pd.to_numeric/pd.to_datatime
①pd.to_numeric()
pd.to_numeric(arg,errors = 'raise',downcast = None)
功能:將arg轉換為數字類型,默認返回dtype為float64或int64。
參數說明:
- arg:標量,列表,元組,一維數組或系列。
- errors :{'ignore','raise','coerce'},默認為'raise'
“ raise”,則無效的解析將引發異常。
“coerce”,則無效解析將設置為NaN。
“ ignore”,則無效的解析將返回輸入 - downcast {'integer','signed','unsigned','float'},默認值none。控制返回的dtype。
# pd.to_numeric()處理Jan Units中的數據
# 無效解析設置為NaN值,fillna()將NaN用0填充
pd.to_numeric(df['Jan Units'],errors='coerce').fillna(0)
②pd.to_datetime()
和時間序列數據有關:pd.to_datetime()官方文檔
# pd.to_datatime()將年月日進行合並
pd.to_datetime(df[['Month','Day','Year']])