DataFrame的基本操作
讀取數據集
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv('titanic_train.csv')
titanic_survival.head()
查看 Age 列的缺失值情況
age = titanic_survival['Age']
pd.isnull(age).loc[:6]
使用布爾型Series過濾缺失值
age_not_null = age[age.isnull() == False]
age_not_null.loc[:6]
使用布爾型Series選取DataFrame
titanic_survival[age.isnull() == False].tail()
使用 dropna 方法過濾缺失值
titanic_survival.dropna(subset=['Age']).tail()
計算年齡的均值
通過 isnull 方法我們已確定 Age 列存在缺失值,需要注意的是,NAN和任何值做計算時,結果都爲NAN:
所以在對某一列做求和,求均值等操作時,需先過濾掉缺失值:
# 計算年齡平均值
age_null = titanic_survival["Age"].isnull()
age = titanic_survival["Age"][age_null == False]
mean_age = sum(age) / len(age)
mean_age
使用 mean 方法可以很方便地計算均值:
重複值過濾
使用 duplicated 方法查看重複項(True爲已經出現過的重複記錄):
titanic_survival.duplicated(subset=['Sex']).head()
除了指定 subset 參數,還可以使用如下的方式:
titanic_survival['Sex'].duplicated().head()
此外,還可以指定多個列,用於判定重複。下面我們過濾Sex和Age列重複的項:
titanic_survival[titanic_survival.duplicated(subset=['Sex', 'Age']) == False].shape
等價於:
titanic_survival.drop_duplicates(subset=['Sex', 'Age']).shape
分組與聚合操作
使用純 python 計算每類 Pclass 的平均 Fare 值:
# 分組與聚合:計算每類旅客的平均票價,分組即:按旅客類型分組;聚合即:求每組的平均值
passenger_classes = set(titanic_survival["Pclass"])
ava_fares = {}
for _class in passenger_classes:
pclass_rows = titanic_survival[titanic_survival['Pclass'] == _class]
pclass_fares = pclass_rows['Fare']
ava_fare = pclass_fares.mean()
ava_fares[_class] = ava_fare
ava_fares
使用 pandas 的數據透視表 pivot_table ,根據 Pclass 分組,對 Fare 列使用 np.mean 進行聚合:
titanic_survival.pivot_table(index='Pclass', values='Fare', aggfunc=np.mean)
此外,還可以對多個列進行聚合:
titanic_survival.pivot_table(index='Pclass', values=['Fare', 'Survived'], aggfunc=np.sum)
aggfunc 除了指定爲 numpy 中的聚合函數外,還可以其它符合條件的函數,可以應用到Series,返回單個值:
titanic_survival.pivot_table(index='Pclass', values='PassengerId', aggfunc=len)
df.apply() 方法的參數和 aggfunc 指定的函數是同類函數,只不過df.apply()會將此函數應用到所有的列:
def no_100_row(column):
no_100 = column.iloc[99]
return no_100
# 對DataFrame的每一列應用上述函數
titanic_survival.apply(no_100_row)
方法總結
方法 | 說明 |
---|---|
pandas.isnull() / series.isnull() | 返回是否爲空的 bool 型的 Series 對象(備註:DataFrame 和 Series 都可以通過 bool 型的Series取值,bool型的 Series 和 True/False 進行比較,可用於數據過濾) |
series.mean() | 自動過濾缺失值,再求平均值 |
df.pivot_table(index=“列名1”, values=“列名2”/[“列名2”,“列名3”,…], aggfunc=聚合函數) | 實現分組、聚合處理;index指定分組依據的列;values指定對哪幾個列做聚合統計運算;aggfunc指定用於series的聚合函數。 |
df.dropna(axis=1) / df.dropna(axis=‘column’) | 刪除存在缺失值的列 |
df.dropna(axis=0, subset=[‘columns1’, ‘columns2’, …]) | 刪除指定列存在缺失值的記錄 |
df.duplicated(subset=None, keep=‘first’) | 返回一個表示記錄是否重複的 bool 型 Series。subset 指定比較的列,keep默認爲 first ,表示將首次出現的重複記錄標記爲 False ,其它位置則爲 True;keep = last,則表示只將重複值最後出現的位置標記爲 False;keep=False,則表示將所有重複的記錄均標記爲 True。 |
df.drop_duplicates(subset=None, keep=‘first’, inplace=False) | 返回去重的dataframe,subset指定去重的列,keep可以爲’first’、‘last’、False,分別代表保留重複項首次出現的記錄、最後一次出現的記錄,False則表示刪除任何重複記錄 |
df.sortvalues(‘列名’, inplace=False, ascending=True) | 返回一個新的升序dataframe |
reset_index(drop=True) | 用於排序後重置索引 |
.loc[行索引,列索引] | 獲取指定值 |