API位址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html
一、資料結構
1.1 Series
Series類似表格中的一個列(column)或者一維數組,可以儲存任何資料類型。
pandas.Series( data, index, dtype, name, copy)
#data:一組資料(ndarray 類型)。
#index:資料索引标簽,如果不指定,預設從 0 開始。
#dtype:資料類型,預設會自己判斷。
#name:設定名稱。
#copy:拷貝原始資料後生成series,預設為 False。
從下圖可以看到當copy=False,修改series的值,對應的array值也會改變。但是當copy=True時,對應的array值不會改變,因為是用拷貝的資料生成的。
需要注意,改變series隻會影響array的值,不影響清單a的值。
1.1.1 清單(list)生成series
import pandas as pd
a = [1, 'xy', {'a': 3}]
ser = pd.Series(b,copy=False)
print(ser)
輸出:
#索引 值
0 1
1 ab
2 {'a': 3}
dtype: object
#索引取值
print(a[1])
輸出:
xy
#自定義索引
myvar2 = pd.Series(a, index=['x', 'y' , 'z'])
print(myvar2)
輸出:
x 1
y xy
z {'a': 3}
dtype: object
1.1.2字典(dict)生成series
import pandas as pd
a = {
'a': 'A',
'b': 'B',
'c': 'C'
}
#指定名稱
myvar = pd.Series(a, name='test')
print(myvar)
輸出:
a A
b B
c C
Name: test, dtype: object
#字典生成series可以根據字典key的值截取資料
myvar2 = pd.Series(a, index=['a', 'c'])
print(myvar2)
輸出:
a A
c C
dtype: object
1.2 DataFrame
DataFrame 是一個表格型的資料結構,它含有一組有序的列,每列可以是不同的值類型(數值、字元串、布爾型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 組成的字典(共同用一個索引)。
pandas.DataFrame( data, index, columns, dtype, copy)
#data:一組資料(ndarray、series, map, lists, dict 等類型)。
#index:索引值,或者可以稱為行标簽。
#columns:列标簽,預設為 RangeIndex (0, 1, 2, …, n) 。
#dtype:資料類型。
#copy:拷貝資料,預設為 False。copy的意義與Series一樣。
1.2.1 清單(list)生成DataFrame
a = [['a', 'b', 'c'], [1, 2, 3]]
myvar = pd.DataFrame(a)
print(myvar)
輸出:
0 1 2
0 a b c
1 1 2 3
#自定義行索引
myvar = pd.DataFrame(index=['x', 'y'])
print(myvar)
輸出:
0 1 2
x a b c
y 1 2 3
#自定義列索引
myvar2 = pd.DataFrame(a, columns=['A','B','C'])
print(myvar2)
輸出:
A B C
0 a b c
1 1 2 3
#根據行索引取一行的值
print(myvar2.loc[0])
輸出:
A a
B b
C c
Name: 0, dtype: object
#loc函數取出來的其實就是一個Series
print(myvar2.iloc[0, :])
輸出:
A a
B b
C c
Name: 0, dtype: object
#根據列索引取一列
print(myvar2['C'])
輸出:
0 c
1 3
Name: 2, dtype: object
#行列索引取具體值
print(myvar2.loc[0]['A'])
輸出:
a
print(myvar2.iloc[0, 0])
輸出:
a
#列行索引取具體值
print(myvar2['A'][0])
輸出:
a
PS:行列取值和列行取值,寫法不一樣。
1.2.2 字典(dict)生成DataFrame
#沒有對應的部分,資料自動補充為為NaN
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data,index=['x','y'])
print(df)
輸出:
a b c
x 1 2 NaN
y 5 10 20.0
#NaN并不是字元串
print(type(df.loc['x']['c']))
輸出:
<class 'numpy.float64'>
#下面這種方式要求每列資料的個數一樣,不然會報錯
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)
print (df)
輸出:
Site Age
0 Google 10
1 Runoob 12
2 Wiki 13
二、CSV檔案讀寫
2.1 讀檔案
#輸出結果為資料的前面 5 行和末尾 5 行,中間部分以 ... 代替
df = pd.read_csv('nba.csv')
#to_string()傳回所有資料
print(df.to_string())
#head(n)傳回資料前n行,預設為5
df = df.head()
tail(n)傳回資料後n行,預設後5
df = df.tail(4)
#info()傳回檔案基本資訊
df.info()
2.2 寫檔案
#to_csv(file,index=False)
#一定要加index=Fales,不然會把行索引當成資料,寫到檔案裡。
#寫是覆寫性質的。
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)
df.to_csv('test.csv', index=False)
三、資料分析
3.1 預處理
3.1.1 篩選
#篩選出年齡大于等于25歲的資料
df[df["Age"] >= 25]
3.1.2 排序
#按照Age字段,降序排列
df.sort_values("Age", ascending=False)
3.1.3 分組
#一般配合計算函數使用,
#mean() 平均值
#sum() 累加
survived_group = df.groupby("Team")
survived_group.mean().head()
Salary一列,因為數值太大,被科學記數了。解決科學計數的問題,加上一下代碼就行。
pd.set_option('display.float_format', lambda x: ' % .2f' % x)
groupby()預設不統計為空的項,可以加上參數dropna=Fales實作統計。
3.1.4 添加資料列
原始資料中,如果需要添加一列資料,或者計算出一個新列。使用apply()來實作這個功能。
apply()需要傳入一個生成資料的函數。
DataFrame.apply(func, axis=1)
#func 生成資料的函數
#axis 函數應用到每列還是每行。預設axis=0應用到列。
def test(age, weight):
a = weight/age
return a
df['test'] = df[['Age','Weight']].apply(lambda x: test(x['Age'],x['Weight']),axis=1)
df
df['test2'] = df.apply(lambda x: 'abc',axis=1)
df
3.1.5 資料清洗
判斷是否為空
#isnull() 判斷每個資料是否為空,傳回True或者False
df.isnull()
df.loc[n].isnull() #判斷第n行的每個資料是否為空
df[n].isnull() #判斷第n列的每個資料是否為空
any() #以列為基準,當該列任一資料為True傳回true,否則傳回false
any(axis=1) #以行為基準,當行任一資料為True傳回true,否則傳回false
#結合isnull()使用,可以判斷每列或者每行是否存在空值
#傳回存在空值的資料
#不能寫成df[df.isnull().any()],會報錯!!!!!
df[df.isnull().any(axis=1)]
Pandas 隻把 n/a 、 NA、None 當作空資料。也可以在讀取檔案時指定空資料類型。
missing_values = ["n/a", "na", "--"]
df = pd.read_csv('test.csv', na_values = missing_values)
删除空資料
找到存在空資料的列或者行,就可以根據需要删除列或者行。
df.dropna() #删除含有空資料的行
df.dropna(axis=1) #删除含有空資料的列
替換空資料
#inplace=True 修改原始資料。如果不寫這個參數,則不修改原始資料。
df.fillna(value, inplace=True) #替換所有空值為value
df.loc[n].fillna(value, inplace=True) #替換第n行的空值為vlaue
df[n].fillna(value, inplace=True) #替換第n列的空值為vlaue
圖中可以看出沒有帶參數inplace=True,原始資料df中的值并沒有被修改。
删除列
df.drop(["Name", "Number"],axis=1)
df.drop(columns=["Name", "Number"])
删除行
df.drop(index=n) #删除第n行
删除也有參數: inplace:bool, default False。控制是否修改源資料。
數值類型修改
pd.to_numeric(arg, downcast='', errors='')
#downcast:{‘integer’, ‘signed’, ‘unsigned’, ‘float’}, default None
#‘integer’ or ‘signed’: smallest signed int dtype (min.: np.int8)
#‘unsigned’: smallest unsigned int dtype (min.: np.uint8)
#‘float’: smallest float dtype (min.: np.float32)
#errors:{‘ignore’, ‘raise’, ‘coerce’}, default ‘raise’
#rasie:觸發異常
#coerce:非數字型資料強制轉為NaN
#ignore:所有資料保持原值
要轉換的資料中如果含有非數字的部分,預設會傳回異常。可以用參數errors處理。
日期樣式修改
pd.to_datetime(arg)
删除重複項
#inplace = True 修改源資料
df.drop_duplicates(inplace = True)
3.2 特征分析
pd.set_option('display.float_format', lambda x: ' % .2f' % x)
df = pd.read_csv('nba.csv')
df.describe(percentiles, include, exclude)
#percentiles 設定數值型特征的統計量,預設是[.25, .5, .75],也就是傳回25%,50%,75%資料量時的數字
#include 指定需要統計的資料類型,預設是隻計算數值型特征的統計量,include='object' 或者include='O'計算離散型統計量,include='all'計算所有。
#exclude 排除不要的資料類型
count | 有效值計數 |
mean | 平均值 |
std | 标準差 |
min | 最小值 |
25% | 四分之一分位數 |
50% | 二分之一分位數 |
75% | 四分之三分位數 |
max | 最大值 |
unique | 不同的值有多少個 |
top | 最常見的值 |
freq | 最常見的值的頻率 |