.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
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
889 | 890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
890 | 891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
891 rows × 12 columns
2、我想檢視DataFrame的前8行。
titanic.head(8)
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
5 | 6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
6 | 7 | 0 | 1 | McCarthy, Mr. Timothy J | male | 54.0 | 0 | 0 | 17463 | 51.8625 | E46 | S |
7 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard | male | 2.0 | 3 | 1 | 349909 | 21.0750 | NaN | S |
要檢視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)以相容所有資料,但你也可以根據自己的需要手動調整。
那麼如何改變資料的型別呢?
- 你可以使用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
- 下面這三個函式都是針對一維陣列的,它們可以將數組裡面的物件轉換成特定型別:
- 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)
- 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)
開啟儲存的檔案檢查一下,
只有最後儲存的一個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)
再檢查一下檔案
成功將兩個DataFrame寫入到同一個Excel表格中。
---------------------分割線------------------------------------------
titanic.csv下載地址:
https://github.com/pandas-dev/pandas/blob/master/doc/data/titanic.csv