1. 程式人生 > 其它 >.vue檔案怎麼使用_pandas使用2:我怎麼讀寫表格檔案

.vue檔案怎麼使用_pandas使用2:我怎麼讀寫表格檔案

技術標籤:.vue檔案怎麼使用groupby 之後的表格轉換成dataframeini檔案怎麼使用pandas object轉floatpandas 根據單號分類pandas修改資料型別

二、我怎麼讀寫表格檔案

1、我想分析泰坦尼克號乘客資料,它們儲存在csv檔案中。

importpandasaspd
titanic=pd.read_csv("./data/titanic.csv")

pandas提供的read_csv()函式可將csv檔案中的資料讀取到DataFrame中。pandas支援許多檔案格式:csv,excel,sql,jason,...。要讀取它們,可以使用字首read_

+檔案格式的函式形式。

讀取資料之後最好應該檢查一下。輸入變數名,就可以展示出讀取的DataFrame,預設是展示前5行和後5行:

titanic
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
.......................................
88688702Montvila, Rev. Juozasmale27.00021153613.0000NaNS
88788811Graham, Miss. Margaret Edithfemale19.00011205330.0000B42S
88888903Johnston, Miss. Catherine Helen "Carrie"femaleNaN12W./C. 660723.4500NaNS
88989011Behr, Mr. Karl Howellmale26.00011136930.0000C148C
89089103Dooley, Mr. Patrickmale32.0003703767.7500NaNQ

891 rows × 12 columns

2、我想檢視DataFrame的前8行。

titanic.head(8)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
5603Moran, Mr. JamesmaleNaN003308778.4583NaNQ
6701McCarthy, Mr. Timothy Jmale54.0001746351.8625E46S
7803Palsson, Master. Gosta Leonardmale2.03134990921.0750NaNS

要檢視DataFrame的前N行資料,請使用head()方法,並把行數N作為引數。而檢視後N行,可以使用tail()方法,比如titanic.tail(10)將返回上面的DataFrame的後10行。

注:dtypes屬性記錄了每一列的資料型別,你可看一看pandas預設是怎麼儲存表格每一列資料的:

titanic.dtypes
PassengerId      int64
Survived int64
Pclass int64
Name object
Sex object
Age float64
SibSp int64
Parch int64
Ticket object
Fare float64
Cabin object
Embarked object
dtype: object

可以看到,該DataFrame中資料型別包括整數(64位整型值int64表示)、浮點數(64位浮點數float64表示)、字串(object表示)。

3、我想把泰坦尼克號乘客的資料儲存到excel表格中。

titanic.to_excel('./data/titanic.xlsx',sheet_name='passengers',index=False)

正如 read_* 函式將檔案中的資料匯入記憶體中,to_* 方法可以將記憶體中儲存的資料寫入到檔案裡。比如:上述呼叫的to_excel()方法就能將titanic資料寫入到excel表格中,sheet_name引數用於修改寫入excel檔案的sheet名,index=False則表名,每行開始的行標籤不會被寫入到檔案中。

4、我想了解 DataFrame 的技術資訊

titanic.info()

RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB

info()方法展示了DataFrame的技術資訊,讓我們仔細看一下結果細節:

  • 第一行的類名資訊表明它確實是一個DataFrame物件
  • 共有891個條目,行標籤值從0到890。
  • 共有12個列(不包括行標籤),#列顯示各列的列號,Column列顯示了各列的列標籤,Non-Null Count列表示非空值的個數,可以看到大多數列第一行都有資料(891 non-null),Age和Cabin列則不足891個非空值。
  • Name,Sex,Cabin和Embarked列為文字資料,其他列都是數字型資料,包括整數和浮點數,它們都彙總在Dtype列。
  • dtypes:統計了每種資料型別的個數
  • 最後一行給出了DataFrame所佔用的記憶體大小。

--------------分割線----------------

pandas的資料型別(dtype)

pandas從numpy衍生而來,因而大多數資料型別(dtype)都與numpy相同,比如float(浮點型),int(整型),bool(布林型),timedelta64[ns](64位的以納秒為單位的時間差型別)以及 datetime64[ns](不帶時區的64位的以納秒為單位的日期時間型別)。除此之外,pandas還擴充套件了一些新的資料型別,以下是一些常用的擴充套件型別:

資料型別內在標量形式字串別名(用於引數傳遞)相關文件
帶時區的日期時間Timestamp'datetime64[ns,]'時區控制
分類變數(none)'category'分類資料(Categorical data)
週期(時間段)Period'period[]', 'Period[]'時間段表示
稀少資料(none)'Sparse', 'Sparse[int]', 'Sparse[float]'稀少資料結構
字串str'string'處理文字資料

注:object是一種特殊的資料型別,它可以儲存任何型別的python物件,當然也包括字串。由於歷史和相容性等原因,它一直作為文字資料的預設資料型別,但這並不值得推薦,pandas為此提供了String型別,因此在自定義型別時應儘量使用後者,在效能等方面更具優勢。

通常情況下,pandas會根據需要自動建立一種合適的資料型別(向上型別轉換upcasting)以相容所有資料,但你也可以根據自己的需要手動調整。

那麼如何改變資料的型別呢?

  1. 你可以使用astype()方法,該方法會返回原DataFrame的副本(傳遞copy=False可以改變此行為),如果轉變型別不合法,則會引發異常。
importnumpyasnp
importpandasaspd
df=pd.DataFrame({'A':pd.Series(np.random.randn(8),dtype='float16'),
'B':pd.Series(np.random.randn(8)),
'C':pd.Series(np.array(np.random.randn(8),
dtype='uint8'))})
df.dtypes
A    float16
B float64
C uint8
dtype: object
df.astype('float32').dtypes
A    float32
B float32
C float32
dtype: object
  1. 下面這三個函式都是針對一維陣列的,它們可以將數組裡面的物件轉換成特定型別:
  • pd.to_numeric()將陣列的型別轉換為數字型,根據資料的不同,返回float64和int64型別的資料。
m=['1.1',2,3]#包含了字串
pd.to_numeric(m)
array([1.1, 2. , 3. ])
  • pd.to_datetime()將字串、python內建datetime物件、時間戳整數值等轉換為pandas的datetime型別。
importdatetime
m=['2016-07-09',datetime.datetime(2016,3,2)]
pd.to_datetime(m)
DatetimeIndex(['2016-07-09', '2016-03-02'], dtype='datetime64[ns]', freq=None)
pd.to_datetime(1490195805,unit='s')
Timestamp('2017-03-22 15:16:45')
  • pd.to_timedelta()將字串資料等轉化為timedelta資料。
m=['5us',pd.Timedelta('1day')]
pd.to_timedelta(m)
TimedeltaIndex(['0 days 00:00:00.000005', '1 days 00:00:00'], dtype='timedelta64[ns]', freq=None)
  1. infer_objects()方法。我們知道object是一個通用的資料型別,什麼都有。而在你剔除了某些“異類”之後不想再使用object型別時,你可以選擇呼叫它,它會將object型別轉換成一個推測(infer)的更好的型別。
df=pd.DataFrame({"A":["a",1,2,3]})
df.dtypes
A    object
dtype: object
df=df.iloc[1:]#刪掉第一行的字串
df.dtypes#仍是object型別
A    object
dtype: object
df.infer_objects().dtypes
A    int64
dtype: object

----------分割線-----------

to_excel()用法延伸

上面可知to_excel()方法可以將DataFrame儲存到Excel表格中,並用利用sheet_name引數修改相應的sheet名。那如果我想將兩個不同的DataFrame儲存到同一個Excel表格的不同sheet裡,像下面這樣對同一個檔案連續呼叫兩次to_excel()方法是否可以呢?

importnumpyasnp
df=pd.DataFrame({'A':pd.Series(np.random.randn(8),dtype='float16'),
'B':pd.Series(np.random.randn(8)),
'C':pd.Series(np.array(np.random.randn(8),
dtype='uint8'))})
titanic.to_excel('./data/multiplesheet.xlsx',sheet_name='titanic',index=False)
df.to_excel('./data/multiplesheet.xlsx',sheet_name='df',index=False)

開啟儲存的檔案檢查一下,

9c6668bb57fec1c97f92b87a01791230.png

只有最後儲存的一個sheet,看來向同一個檔案連續呼叫兩次方法是行不通的。這是因為,to_excel()命令在資料寫入檔案後就會將檔案關閉以防止出現意外的寫入錯誤。因此第二次再呼叫時相當於重新開啟一遍該檔案,所有操作都會將原檔案覆蓋掉。那要怎麼解決這個問題呢?這時就需要python的上下文管理器with語句配合pandas支援的ExcelWriter(Excel編寫器),ExcelWriter負責建立寫入檔案的物件,with語句則維持檔案開啟的狀態直到全部寫入操作完成。

withpd.ExcelWriter('./data/multiplesheet.xlsx')aswriter:
#建立一個寫入檔案的物件,並賦予writer別名,後續向writer寫入資料即可
titanic.to_excel(writer,sheet_name="titanic",index=False)
df.to_excel(writer,sheet_name="df",index=False)

再檢查一下檔案

8e970bc8571abd12a956d59ed3f00e98.png

成功將兩個DataFrame寫入到同一個Excel表格中。

---------------------分割線------------------------------------------

titanic.csv下載地址:

https://github.com/pandas-dev/pandas/blob/master/doc/data/titanic.csv