DataFrame對象
文章目錄
- DataFrame對象
- 導入本文需要的包
- DataFrame與Series的相似之處
- 使用`read_csv`函數導入DataFrame
- Series和DataFrame的共享與專有屬性
- Series和DataFrame的共有方法
- 對DataFrame進行排序
- 按照單列進行排序
- 按照多列進行排序
- 按照索引進行排序
- 對列索引進行排序
- 設置索引
- 從DataFrame中選擇列
- 從DataFrame中選擇單列
- 從DataFrame中選擇多列
- 從DataFrame中選擇行
- 使用索引標簽提取行
- 按索引位置提取行
- 從特征列中提取特征值
- 對行或列進行重命名
- 重置索引
- 代碼挑戰
- 解決方案
DataFrame是具有行和列的二維數據表,相比于Series,DataFrame可以有很多列。并且DataFrame很多操作與Series相似
導入本文需要的包
import pandas as pd
import numpy as np
通過字典創建DataFrame
city_data = {"City": ["New York City", "Paris", "Barcelona", "Rome"],"Country": ["United States", "France", "Spain", "Italy"],"Population": [8600000, 2141000, 5515000, 2873000]
}
cities = pd.DataFrame(city_data)
cities
DataFrame與Series的相似之處
使用read_csv
函數導入DataFrame
nba = pd.read_csv("./pandas-in-action-master/chapter_04_the_dataframe_object/nba.csv",parse_dates=["Birthday"])
nba
Series和DataFrame的共享與專有屬性
Series只有一列,所以其只有一個dtype屬性。而DataFrame有很多
pd.Series([1, 2, 3]).dtype
nba.dtypes
注意Series是
dtype
,DataFrame是dtypes
查看列名:
nba.columns
查看維度:
nba.shape
計算數值總數:
nba.size
這樣得到的事包含缺失值的數量,如果想要查看排出缺失值的總數,可以用下面這種方法
nba.count().sum()
Series和DataFrame的共有方法
nba.head(2)
nba.tail(n = 3)
nba.sample(3)
nba.max()
nba.min()
nba.nlargest(n = 4, columns = "Salary")
# 只對數字字段加和
nba.sum(numeric_only = True)
nba.mean(numeric_only = True)
nba.median(numeric_only = True)
nba.mode(numeric_only = True)
nba.std(numeric_only = True)
對DataFrame進行排序
按照單列進行排序
nba.sort_values("Name")
nba.sort_values(by = "Name")
nba.sort_values(by = "Name", ascending = False) # 降序
按照多列進行排序
nba.sort_values(by = ["Team", "Name"])
# 還可以指定每一列是升序還是降序
nba.sort_values(by = ["Team", "Name"], ascending = [True, False])
按照索引進行排序
# 在存儲排序之后,我們還可以通過對索引排序來恢復
nba = nba.sort_values(by = ["Team", "Name"], ascending = [True, False])
nba
nba = nba.sort_index()
nba
對列索引進行排序
nba.sort_index(axis = "columns")
nba.sort_index(axis = 1)
設置索引
nba.set_index(keys = "Name")
nba.set_index("Name")
nba = nba.set_index("Name") # 覆蓋
上面兩種是相同的
從DataFrame中選擇列
從DataFrame中選擇單列
nba.Salary
這種方式返回的是對應的Series
還可以:
nba[("Salary")]
這種方法的優點是支持帶空格的列名,如果列名帶空格只能通過方括號來提取
從DataFrame中選擇多列
nba[["Salary", 'Birthday']]
中括號里的順序變了,輸出的順序也會變
nba[['Birthday', 'Salary']]
可以使用select_dtypes
方法,根據數據類型選擇列。該方法接受兩個參數include
和exclude
。參數接收單個字符串或列表,表示Pandas應保留或丟棄的列類型。
nba.select_dtypes(include = "object")
nba.select_dtypes(exclude = ["object", "int"])
從DataFrame中選擇行
使用索引標簽提取行
nba.loc["LeBron James"]
nba.loc[["LeBron James", "Paul George"]]
同樣的索引時的順序,代表輸出的順序
還支持Python的列表切片語法
nba.sort_index().loc["Otto Porter" : "Patrick Beverley"]
nba.sort_index().loc["Zach Collins":]
nba.sort_index().loc[:"Al Horford"]
loc切片包括上限的值,但列表切片不包括上限的值
按索引位置提取行
nba.iloc[300]
nba.iloc[[100, 200, 300, 400]]
nba.iloc[400:404]
nba.iloc[:2]
nba.iloc[447:]
從特征列中提取特征值
nba.loc["Giannis Antetokounmpo", "Team"]
nba.loc["James Harden", ["Position", "Birthday"]]
nba.loc[["Russell Westbrook", "Anthony Davis"], ["Team", "Position"]]
nba.loc["Joel Embiid", "Position" : "Salary"]
nba.iloc[57, 3]
使用
loc
和iloc
的時因為Pandas要先確定傳入的數據類型,所以運行速度較慢。如果只需要提取單個值的時候,可以用at
代替loc
,用iat
代替iloc
,使代碼的運行速度更快。其中at系列和loc系列的使用方法類似。同時at系列也可以用于Series
對行或列進行重命名
查看列名:
nba.columns
可以通過為該屬性分配新名稱來重命名DataFrame的任何或所有列
nba.columns = ["Team", "position", "Date of Birth", "Pay"]
還可以通過rename
傳入一個字典實現,其中字典的值是新的名稱
nba = nba.rename(columns = {"Date of Birth": "Birthday"})
將上面代碼中的columns換位index就為更改索引名稱
重置索引
現在我想要將Team作為新的索引,但我直接通過set_index
更改會導致Name列數據的丟失
nba.set_index("Team").head()
我們可以通過reset_index
之前的索引替換為數字索引,并且那一列會被保留,再更換索引
nba.reset_index().set_index("Team").head()
代碼挑戰
nfl.csv 文件包含美國國家橄欖球聯盟中與 NBA 相似的數據結構,包括球員的 Name、Team、Position、Birthday 和 Salary 信息。嘗試回答如下問題:
- 如何導入 nfl.csv 文件,并將其 Birthday 列中的值轉換為日期時間類型?
- 可以通過哪兩種方式設置 DataFrame 索引來存儲球員姓名?
- 如何計算這個數據集中每支球隊的球員人數?
- 收入最高的 5 名球員是誰?
- 如何先按球隊名稱升序對數據集進行排序,然后按薪資降序對數據集進行排序?
- New York Jets 隊年齡最大的球員是誰,他的生日是哪天?
解決方案
# 1
nfl = pd.read_csv("./pandas-in-action-master/chapter_04_the_dataframe_object/nfl.csv", parse_dates=["Birthday"])# 2
nfl = pd.read_csv("./pandas-in-action-master/chapter_04_the_dataframe_object/nfl.csv", parse_dates=["Birthday"], index_col = "Name")
nfl = pd.read_csv("./pandas-in-action-master/chapter_04_the_dataframe_object/nfl.csv", parse_dates=["Birthday"])
nfl = nfl.set_index("Name")# 3
nfl.Team.value_counts()# 4
nfl.sort_values(by = "Salary", ascending = False)# 5
nfl.sort_values(by = ["Team", "Salary"], ascending = [True, False])# 6
# 先將Team列設置為索引
nfl = nfl.reset_index().set_index("Team")
nfl.loc["New York Jets"].sort_values("Birthday").head(1)