天天看點

Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

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的值。 

Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

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')
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
#to_string()傳回所有資料
print(df.to_string())
           
#head(n)傳回資料前n行,預設為5
df = df.head()
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
tail(n)傳回資料後n行,預設後5
df = df.tail(4)
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
#info()傳回檔案基本資訊
df.info()
           

Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

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]
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

3.1.2 排序

#按照Age字段,降序排列
df.sort_values("Age", ascending=False)
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

3.1.3 分組

#一般配合計算函數使用,
#mean()   平均值
#sum()    累加
survived_group = df.groupby("Team")
survived_group.mean().head()
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

        Salary一列,因為數值太大,被科學記數了。解決科學計數的問題,加上一下代碼就行。

pd.set_option('display.float_format', lambda x: ' % .2f' % x)
           

        groupby()預設不統計為空的項,可以加上參數dropna=Fales實作統計。

Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

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
           

Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

df['test2'] = df.apply(lambda x: 'abc',axis=1)
df
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

3.1.5 資料清洗

        判斷是否為空

#isnull() 判斷每個資料是否為空,傳回True或者False
df.isnull()
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
df.loc[n].isnull()  #判斷第n行的每個資料是否為空
df[n].isnull()      #判斷第n列的每個資料是否為空
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
any()       #以列為基準,當該列任一資料為True傳回true,否則傳回false
any(axis=1) #以行為基準,當行任一資料為True傳回true,否則傳回false
#結合isnull()使用,可以判斷每列或者每行是否存在空值
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
#傳回存在空值的資料
#不能寫成df[df.isnull().any()],會報錯!!!!!
df[df.isnull().any(axis=1)]
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

          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)  #删除含有空資料的列
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

替換空資料 

#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
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

         圖中可以看出沒有帶參數inplace=True,原始資料df中的值并沒有被修改。

删除列

df.drop(["Name", "Number"],axis=1)
df.drop(columns=["Name", "Number"])
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

删除行

df.drop(index=n)   #删除第n行
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

        删除也有參數: 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:所有資料保持原值
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

        要轉換的資料中如果含有非數字的部分,預設會傳回異常。可以用參數errors處理。

Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

日期樣式修改

pd.to_datetime(arg)
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

删除重複項

#inplace = True  修改源資料
df.drop_duplicates(inplace = True)
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析

 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  排除不要的資料類型
           
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
Pandas(持續更新)一、資料結構二、CSV檔案讀寫  三、資料分析
count 有效值計數
mean 平均值
std 标準差
min         最小值
25% 四分之一分位數
50% 二分之一分位數
75% 四分之三分位數
max 最大值
unique 不同的值有多少個
top 最常見的值
freq 最常見的值的頻率

繼續閱讀