柚子快報(bào)邀請碼778899分享:Pandas數(shù)據(jù)類型
柚子快報(bào)邀請碼778899分享:Pandas數(shù)據(jù)類型
Pandas數(shù)據(jù)類型
學(xué)習(xí)目標(biāo)
知道Pandas中都有哪些數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),并知道數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系知道時間日期類型作為索引的數(shù)據(jù)集可以基于時間范圍來選取子集知道時間差類型索引的數(shù)據(jù)集可以基于時間差范圍來選取子集
1 一般類型
Pandas數(shù)據(jù)類型Python類型說明objectstr字符串int64int整數(shù)float64float浮點(diǎn)數(shù)boolbool布爾值category無原生類型分類類型datetime無原生類型時間日期類型timedelta無原生類型時間差類型
pandas是基于numpy構(gòu)建的包,所以pandas中的數(shù)據(jù)類型都是基于Numpy中的ndarray類型實(shí)現(xiàn)的 Pandas中的數(shù)據(jù)結(jié)構(gòu)對象和數(shù)據(jù)類型對象:
dataframe 表 【數(shù)據(jù)結(jié)構(gòu)】
series 列【數(shù)據(jù)結(jié)構(gòu)】
object --> python str 字符串 【數(shù)據(jù)類型】int64 --> python int 整數(shù) 【數(shù)據(jù)類型】float64 --> python float 小數(shù) 【數(shù)據(jù)類型】bool --> python bool True False 【數(shù)據(jù)類型】datetime64 --> python datetime 時間日期 【數(shù)據(jù)類型】timedelta[ns]–> 兩個時間點(diǎn)之間相距的時間差,單位是納秒 【數(shù)據(jù)類型】category --> 特定分類數(shù)據(jù)類型,比如性別分為男、女、其他 【數(shù)據(jù)類型】 字符串object 、整數(shù)int、小數(shù)float 以及 布爾值bool類型都是比較常見的一般類型;本章節(jié)將詳細(xì)介紹不常見的 時間類型 以及 時間差類型 import pandas as pd
# 加載印度城市空氣質(zhì)量數(shù)據(jù)集
df = pd.read_csv('../data/city_day.csv')
# 查看數(shù)據(jù)集各列及各自的數(shù)據(jù)類型
df.info()
# 數(shù)據(jù)結(jié)果如下
DatetimeIndex: 29531 entries, 2015-01-01 to 2020-07-01
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 City 29531 non-null object
1 PM2.5 24933 non-null float64
2 PM10 18391 non-null float64
3 NO 25949 non-null float64
4 NO2 25946 non-null float64
5 NOx 25346 non-null float64
6 NH3 19203 non-null float64
7 CO 27472 non-null float64
8 SO2 25677 non-null float64
9 O3 25509 non-null float64
10 Benzene 23908 non-null float64
11 Toluene 21490 non-null float64
12 Xylene 11422 non-null float64
13 AQI 24850 non-null float64
14 AQI_Bucket 24850 non-null object
dtypes: float64(13), object(2)
memory usage: 3.6+ MB
2 類型轉(zhuǎn)換
通過 astype() 或 to_numeric() 實(shí)現(xiàn)類型轉(zhuǎn)換
2.1 seriers.astype函數(shù)轉(zhuǎn)換數(shù)據(jù)類型
astype函數(shù)是通用函數(shù),可用于把DataFrame中的任何列(Series)轉(zhuǎn)換為其他dtype;可以向astype方法提供任何內(nèi)置類型或numpy類型來轉(zhuǎn)換列(Series)的數(shù)據(jù)類型
astype函數(shù)使用 print(df['PM2.5'].astype(dtype=str))
print(df['PM2.5'].astype(dtype=object))
# 以上效果相同, 輸出結(jié)果如下
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
...
29526 15.02
29527 24.38
29528 22.91
29529 16.64
29530 15
Name: PM2.5, Length: 29531, dtype: object
astype注意點(diǎn)
astype函數(shù)要求DataFrame列的數(shù)據(jù)類型必須相同,當(dāng)有些數(shù)據(jù)中有缺失,但不是NaN時(如’missing’,'null’等),會使整列數(shù)據(jù)變成字符串類型而不是數(shù)值型,這個時候就會報(bào)錯
df2 = df.head().copy()
# 創(chuàng)造包含'missing'為缺失值的數(shù)據(jù),批量替換第1、3、5行中NO列的值為字符串'missing'
df2.loc[::2, 'NO'] = 'missing'
print(df2)
print(df2['NO'].dtypes)
# 輸出結(jié)果如下
City Date PM2.5 PM10 ... Toluene Xylene AQI AQI_Bucket
0 Ahmedabad 2015-01-01 NaN NaN ... 0.02 0.00 NaN NaN
1 Ahmedabad 2015-01-02 NaN NaN ... 5.50 3.77 NaN NaN
2 Ahmedabad 2015-01-03 NaN NaN ... 16.40 2.25 NaN NaN
3 Ahmedabad 2015-01-04 NaN NaN ... 10.14 1.00 NaN NaN
4 Ahmedabad 2015-01-05 NaN NaN ... 18.89 2.78 NaN NaN
[5 rows x 16 columns]
object
此時運(yùn)行下面的代碼會報(bào)錯ValueError: could not convert string to float: 'missing',無法使用astype函數(shù)進(jìn)行類型轉(zhuǎn)換;這個時候我們可以使用to_numeric函數(shù) print(df2['NO'].astype(float))
2.2 pd.to_numeric函數(shù)字符串轉(zhuǎn)數(shù)字類型
astype函數(shù)要求DataFrame列的數(shù)據(jù)類型必須相同,當(dāng)有些數(shù)據(jù)中有缺失,但不是NaN時(如’missing’,'null’等),會使整列數(shù)據(jù)變成字符串類型而不是數(shù)值型,這個時候可以使用to_numeric處理
pd.to_numeric函數(shù)的參數(shù)errors, 它決定了當(dāng)該函數(shù)遇到無法轉(zhuǎn)換的數(shù)值時該如何處理
默認(rèn)情況下,該值為raise,如果to_numeric遇到無法轉(zhuǎn)換的值時,會拋出異常coerce: 如果to_numeric遇到無法轉(zhuǎn)換的值時,會返回NaN值ignore: 如果to_numeric遇到無法轉(zhuǎn)換的值時會放棄轉(zhuǎn)換,什么都不做 # 轉(zhuǎn)換成float類型, 拋出異常:ValueError: Unable to parse string "missing" at position 0
# print(pd.to_numeric(df2['NO']))
# 無法轉(zhuǎn)換的值返回NaN
print(pd.to_numeric(df2['NO'], errors='coerce'))
# 無法轉(zhuǎn)換的值返回原值
print(pd.to_numeric(df2['NO'], errors='ignore'))
# 輸出結(jié)果
0 NaN
1 0.97
2 NaN
3 1.70
4 NaN
Name: NO, dtype: float64
0 missing
1 0.97
2 missing
3 1.7
4 missing
Name: NO, dtype: object
3 datetime時間類型
3.1 Python中的datetime類型
python沒有原生的datetime數(shù)據(jù)類型,需要使用datetime包 from datetime import datetime
now = datetime.now()
someday = datetime(2020, 1, 1)
print(now)
print(type(now))
print(someday)
print(type(someday))
# 返回輸出結(jié)果如下
2024-02-07 09:50:20.461322
2020-01-01 00:00:00
3.2 讀取數(shù)據(jù)時指定列為datetime類型
讀取數(shù)據(jù)集時,使用參數(shù)parse_dates=[列下標(biāo)/列名]直接將轉(zhuǎn)為datetime類型 # 加載印度城市空氣質(zhì)量數(shù)據(jù)集
# df = pd.read_csv('../data/city_day.csv', parse_dates=[1])
df = pd.read_csv('../data/city_day.csv', parse_dates=['Date'])
print(df['Date'].head())
# 數(shù)據(jù)結(jié)果如下
0 2015-01-01
1 2015-01-02
2 2015-01-03
3 2015-01-04
4 2015-01-05
Name: Date, dtype: datetime64[ns]
3.3 pd.to_datetime將字符串轉(zhuǎn)換為時間日期類型
df = pd.read_csv('../data/city_day.csv')
# 查看Date列數(shù)據(jù)類型
print(df['Date'].head())
# 將Date列數(shù)據(jù)轉(zhuǎn)換為時間類型
df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].head())
# 輸出結(jié)果如下
0 2015-01-01
1 2015-01-02
2 2015-01-03
3 2015-01-04
4 2015-01-05
Name: Date, dtype: object
0 2015-01-01
1 2015-01-02
2 2015-01-03
3 2015-01-04
4 2015-01-05
Name: Date, dtype: datetime64[ns]
3.4 提取datetime類型數(shù)據(jù)中具體時間
由datetime構(gòu)成的Seriers提取時間日期中的各個部分 # print(df['Date'].year) # 報(bào)錯
print(df['Date'].dt.year)
print(df['Date'].dt.month)
print(df['Date'].dt.day)
print(df['Date'].dt.hour)
print(df['Date'].dt.minute)
print(df['Date'].dt.second)
print(df['Date'].dt.quarter) # 季度
print(df['Date'].dt.dayofweek + 1) # 星期,與 df['Date'].dt.weekday+1 相同
print(df['Date'].dt.weekday + 1) # 星期
由datetime構(gòu)成的Seriers的其中一個數(shù)據(jù)提取時間日期中的各個部分 d = pd.to_datetime('2020-06-20')
print(d) # d ==> 2020-06-20 00:00:00
print(type(d)) #
print(d.year)
print(d.month)
print(d.day)
print(d.hour)
print(d.minute)
print(d.second)
print(d.quarter) # 季度
print(d.weekday()) # 星期幾,與d.dayofweek相同 0是星期一 1是星期二 6是星期日
print(d.dayofweek + 1)
3.5 datetime類型的Seriers進(jìn)行時間計(jì)算
datetime類型的日期可以直接進(jìn)行時間計(jì)算:
可以直接使用聚合函數(shù)也可以直接進(jìn)行時間差運(yùn)算 # 直接調(diào)用聚合函數(shù)
print(df['Date'].min())
# 直接進(jìn)行時間差運(yùn)算
# 返回時間差類型數(shù)據(jù)構(gòu)成的Seriers
print(df['Date'] - df['Date'].min())
# 輸出結(jié)果如下
2015-01-01 00:00:00
0 0 days
1 1 days
2 2 days
3 3 days
4 4 days
...
29526 2004 days
29527 2005 days
29528 2006 days
29529 2007 days
29530 2008 days
Name: Date, Length: 29531, dtype: timedelta64[ns]
3.6 datetime類型數(shù)據(jù)列作為df索引
datetime類型數(shù)據(jù)列作為df索引可以通過具體的時間查詢df子集 # 加載數(shù)據(jù)集,設(shè)定時間類型列為索引列
df = pd.read_csv('../data/city_day.csv', index_col='Date', parse_dates=True)
# 對索引進(jìn)行重新排序
df = df.sort_index() # 必要步驟
print(df['2018']) # 索引排序之后,才能按年取子集df
print(df['2016-06']) # 按年月取子集df:所有符合條件的完整行數(shù)據(jù)
print(df.loc['2015-3-4 22': '2016-1-1 23:45:00']) # 按時間范圍取子集
# 輸出結(jié)果如下
City PM2.5 PM10 ... Xylene AQI AQI_Bucket
Date ...
2018-01-01 Hyderabad 57.70 119.64 ... 3.74 122.0 Moderate
2018-01-01 Delhi 303.41 415.09 ... 0.24 462.0 Severe
2018-01-01 Ahmedabad 84.46 NaN ... 6.33 278.0 Poor
2018-01-01 Visakhapatnam 59.73 99.04 ... 0.66 131.0 Moderate
2018-01-01 Talcher NaN NaN ... NaN NaN NaN
... ... ... ... ... ... ... ...
2018-12-31 Brajrajnagar 113.28 187.85 ... NaN 236.0 Poor
2018-12-31 Ahmedabad 80.54 NaN ... 6.93 744.0 Severe
2018-12-31 Lucknow 248.51 NaN ... NaN 403.0 Severe
2018-12-31 Talcher 84.30 263.09 ... NaN 200.0 Moderate
2018-12-31 Amritsar 78.42 186.41 ... 9.09 184.0 Moderate
[6471 rows x 15 columns]
City PM2.5 PM10 ... Xylene AQI AQI_Bucket
Date ...
2016-06-01 Patna 68.89 NaN ... 0.45 147.0 Moderate
2016-06-01 Lucknow 138.37 NaN ... NaN 207.0 Poor
2016-06-01 Ahmedabad NaN NaN ... NaN NaN NaN
2016-06-01 Delhi 76.56 251.87 ... NaN 283.0 Poor
2016-06-01 Hyderabad 39.88 NaN ... 0.23 111.0 Moderate
... ... ... ... ... ... ... ...
2016-06-30 Mumbai NaN NaN ... NaN NaN NaN
2016-06-30 Lucknow 89.00 NaN ... NaN 59.0 Satisfactory
2016-06-30 Patna 45.54 NaN ... 0.17 85.0 Satisfactory
2016-06-30 Delhi 69.65 103.25 ... NaN 190.0 Moderate
2016-06-30 Ahmedabad 30.16 NaN ... 0.00 256.0 Poor
[270 rows x 15 columns]
City PM2.5 PM10 ... Xylene AQI AQI_Bucket
Date ...
2015-03-05 Delhi 106.57 196.19 ... 10.65 275.0 Poor
2015-03-05 Hyderabad NaN NaN ... 1.01 NaN NaN
2015-03-05 Lucknow NaN NaN ... NaN NaN NaN
2015-03-05 Ahmedabad 173.01 NaN ... 4.13 780.0 Severe
2015-03-05 Chennai NaN NaN ... NaN NaN NaN
... ... ... ... ... ... ... ...
2016-01-01 Bengaluru 56.40 95.08 ... NaN 101.0 Moderate
2016-01-01 Delhi 295.71 476.09 ... 0.00 463.0 Severe
2016-01-01 Hyderabad 232.83 108.20 ... 2.41 387.0 Very Poor
2016-01-01 Patna 553.63 NaN ... 2.34 619.0 Severe
2016-01-01 Lucknow 203.43 NaN ... NaN 375.0 Very Poor
[2372 rows x 15 columns]
4 timedelta時間差類型
4.1 Python中的timedelta類型
python沒有原生的timedelta數(shù)據(jù)類型,需要使用datetime包 from datetime import datetime
t1 = datetime.now()
t2 = datetime(2020, 1, 1)
diff = t1 - t2
# 時間差類型
print(diff)
print(type(diff))
# 輸出結(jié)果如下
1498 days, 10:07:14.970549
4.2 Pandas中的timedelta類型
兩個時間Seriers相減即可得到timedelta類型數(shù)據(jù)構(gòu)成的Seriers對象 # 加載數(shù)據(jù),指定下標(biāo)為1的列為時間日期類型
df = pd.read_csv('../data/city_day.csv', parse_dates=[1])
# 當(dāng)前日期減去數(shù)據(jù)集中最早的日期,即可得到時間差;同時賦值給新的列
df['ref_date'] = df['Date'] - df['Date'].min()
print(df['ref_date'].head())
# 輸出結(jié)果如下
0 0 days
1 1 days
2 2 days
3 3 days
4 4 days
Name: ref_date, dtype: timedelta64[ns]
4.3 pd.to_timedelta函數(shù)轉(zhuǎn)換timedelta類型
timedelta類型轉(zhuǎn)換為字符串類型 s1 = df['ref_date'].astype(str)
print(s1)
# 返回結(jié)果如下
0 0 days
1 1 days
2 2 days
3 3 days
4 4 days
...
29526 2004 days
29527 2005 days
29528 2006 days
29529 2007 days
29530 2008 days
Name: ref_date, Length: 29531, dtype: object
字符串類型轉(zhuǎn)換為timedelta類型 s2 = pd.to_timedelta(s1)
print(s2)
# 返回結(jié)果如下
0 0 days
1 1 days
2 2 days
3 3 days
4 4 days
...
29526 2004 days
29527 2005 days
29528 2006 days
29529 2007 days
29530 2008 days
Name: ref_date, Length: 29531, dtype: timedelta64[ns]
4.4 timedelta類型數(shù)據(jù)作為df索引
如果將timedelta類型數(shù)據(jù)作為df索引,就可以基于時間差范圍來選擇數(shù)據(jù) # 讀取數(shù)據(jù),并將下標(biāo)為1的Date列設(shè)為時間類型列
df = pd.read_csv('../data/city_day.csv', parse_dates=[1])
# 獲取印度城市德里的子集
df2 = df.query('City=="Delhi"')
# 將timedelta類型的Series設(shè)置為df的索引
# df2.索引 = Date列 - Date列最早的那一天
df2.index = df2['Date'] - df2['Date'].min()
print(df2.head()) # 查看數(shù)據(jù)集
# 基于時間差范圍來選擇數(shù)據(jù)
print(df2['0 days':'4 days'])
# 輸出結(jié)果如下
City Date PM2.5 PM10 ... Toluene Xylene AQI AQI_Bucket
Date ...
0 days Delhi 2015-01-01 313.22 607.98 ... 24.86 9.84 472.0 Severe
1 days Delhi 2015-01-02 186.18 269.55 ... 20.09 4.29 454.0 Severe
2 days Delhi 2015-01-03 87.18 131.90 ... 10.23 1.99 143.0 Moderate
3 days Delhi 2015-01-04 151.84 241.84 ... 9.71 3.34 319.0 Very Poor
4 days Delhi 2015-01-05 146.60 219.13 ... 6.21 2.96 325.0 Very Poor
[5 rows x 16 columns]
City Date PM2.5 PM10 ... Toluene Xylene AQI AQI_Bucket
Date ...
0 days Delhi 2015-01-01 313.22 607.98 ... 24.86 9.84 472.0 Severe
1 days Delhi 2015-01-02 186.18 269.55 ... 20.09 4.29 454.0 Severe
2 days Delhi 2015-01-03 87.18 131.90 ... 10.23 1.99 143.0 Moderate
3 days Delhi 2015-01-04 151.84 241.84 ... 9.71 3.34 319.0 Very Poor
4 days Delhi 2015-01-05 146.60 219.13 ... 6.21 2.96 325.0 Very Poor
[5 rows x 16 columns]
總結(jié)
請對下面的內(nèi)容 有印象、能找到、能理解、能看懂
1. Pandas中的數(shù)據(jù)類型
Pandas數(shù)據(jù)類型Python類型說明objectstr字符串int64int整數(shù)float64float浮點(diǎn)數(shù)boolbool布爾值category無原生類型分類類型datetime無原生類型時間日期類型timedelta無原生類型時間差類型
2. Pandas中數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型的關(guān)系
pandas是基于numpy構(gòu)建的包,所以pandas中的數(shù)據(jù)類型都是基于Numpy中的ndarray類型實(shí)現(xiàn)的Pandas中的數(shù)據(jù)結(jié)構(gòu)對象和數(shù)據(jù)類型對象:
dataframe 表 【數(shù)據(jù)結(jié)構(gòu)】
series 列【數(shù)據(jù)結(jié)構(gòu)】
object --> python str 字符串 【數(shù)據(jù)類型】int64 --> python int 整數(shù) 【數(shù)據(jù)類型】float64 --> python float 小數(shù) 【數(shù)據(jù)類型】bool --> python bool True False 【數(shù)據(jù)類型】datetime64 --> python datetime 時間日期 【數(shù)據(jù)類型】 timedelta[ns]–> 兩個時間點(diǎn)之間相距的時間差,單位是納秒 【數(shù)據(jù)類型】
3. Pandas數(shù)據(jù)類型轉(zhuǎn)換基本方法
df['列名'].astype(str)當(dāng)Seriers對象使用astype函數(shù)轉(zhuǎn)換的結(jié)果中數(shù)據(jù)類型不同時,使用to_numeric函數(shù)
pd.to_numeric(df['列名'], errors='coerce')無法轉(zhuǎn)換的值返回NaNpd.to_numeric(df['列名'], errors='ignore') 無法轉(zhuǎn)換的值返回原值
4. datetime時間類型
datetime時間類型的Seriers來源兩種方式:
讀取時指定 df = pd.read_csv('..xxx.csv', parse_dates=[1])轉(zhuǎn)換 df['Date'] = pd.to_datetime(df['Date']) 提取datetime時間類型的Seriers中的具體年月日時分秒星期
df['Date'].dt.yeardf['Date'].dt.quarter # 季度df['Date'].dt.dayofweek + 1 # 星期 提取datetime時間類型的Seriers中的某一個值的具體年月日時分秒星期
df4['Date'][0].dayofweek+1 # 星期 datetime時間類型的Seriers可以進(jìn)行時間計(jì)算
直接調(diào)用聚合函數(shù) df['Date'].max() # 最近的日期計(jì)算時間差 df['Date'] - df['Date'].min() # 返回時間差類型數(shù)據(jù)構(gòu)成的Seriers datetime時間類型的S對象作為索引的兩種方式
df = pd.read_csv('..xxx.csv', index_col='Date', parse_dates=True)df.index = df['date']注意:要對索引進(jìn)行重新排序 必要步驟 df = df.sort_index() datetime時間類型索引可以按照時間范圍取子集
df['2018']df['2016-06']df.loc['2015-3-4 22': '2016-1-1 23:45:00']
5. timedelta時間差類型
timedelta時間差類型的創(chuàng)建:
df['date_diff'] = df['Date'] - df['Date'].min() 字符串類型轉(zhuǎn)換為時間差類型
s2 = pd.to_timedelta(s1) timedelta時間差類型設(shè)為索引
df.index = df['Date'] - df['Date'].min() 基于時間差范圍來選擇數(shù)據(jù)
df['0 days':'4 days']
柚子快報(bào)邀請碼778899分享:Pandas數(shù)據(jù)類型
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。