學習筆記,這個筆記以例子爲主。
開發工具:Spyder
數據框DateFrame
DataFrame是一個類似於表格的數據類型,可以理解爲一個二維數組,索引有兩個維度,可更改。
- DataFrame的特點
①列可以是不同的類型
②大小可變
③標記軸(行和列)
④可以對行和列執行算術運算
- 語法
import numpy as np
import pandas as pd
#創建一個空的DataFrame對象
df = pd.DataFrame()
#從列表創建DataFrame
data = [['A', 9], ['B', 12], ['C', 15]]
df = pd.DataFrame(data)
#從字典創建DataFrame
data = [{'A':1, 'B':2},
{'A':3, 'B':4, 'C':5}]
df = pd.DataFrame(data)
- 例子1(列表構造方式)
代碼1:
import numpy as np
import pandas as pd
#從列表創建DataFrame
data = [['Ada', 9], ['Black', 12], ['Jack', 15]]
df = pd.DataFrame(data)
print(df)
結果1:
0 1
0 Ada 9
1 Black 12
2 Jack 15
代碼2(設置列名):
data = [['Ada', 9], ['Black', 12], ['Jack', 15]]
df = pd.DataFrame(data, columns = ['name', 'age'])
print(df)
print('-'*10)
print(df.dtypes)
結果2:
name age
0 Ada 9
1 Black 12
2 Jack 15
----------
name object
age int64
dtype: object
代碼3(設置數據類型):
data = [['Ada', 9], ['Black', 12], ['Jack', 15]]
df = pd.DataFrame(data,
columns = ['name', 'age'],
dtype = float)
print(df)
print('-'*10)
print(df.dtypes)
結果3:
name age
0 Ada 9.0
1 Black 12.0
2 Jack 15.0
----------
name object
age float64
dtype: object
- 例子2(字典構造方式)
代碼1:
import pandas as pd
data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15]}
df = pd.DataFrame(data)
print(df)
結果1:
age name
0 9 Ada
1 19 Tom
2 12 Black
3 15 Jack
備註:字典無序,所以構成dataframe類型時,列會自動的按照列名的首字母排序
代碼2(設置行名):
df = pd.DataFrame(data,
index = ['A', 'B', 'C', 'D'])
print(df)
結果2:
age name
A 9 Ada
B 19 Tom
C 12 Black
D 15 Jack
代碼3:
df = pd.DataFrame(data,
index = pd.date_range(
'2020-01-01', periods = 4))
print(df)
結果3:
age name
2020-01-01 9 Ada
2020-01-02 19 Tom
2020-01-03 12 Black
2020-01-04 15 Jack
- 例子3(字典的其他構造方式)
代碼1:
import pandas as pd
data = [{'A':1, 'B':2},
{'A':3, 'B':4, 'C':5}]
df = pd.DataFrame(data)
print(df)
結果1:
A B C
0 1 2 NaN
1 3 4 5.0
代碼2:
import pandas as pd
data = {'A':pd.Series([1, 2, 3], index = ['one', 'two', 'three']),
'B':pd.Series([1, 2, 3, 4], index = ['one', 'two', 'three', 'four'])}
df = pd.DataFrame(data)
print(df)
結果2:
A B
four NaN 4
one 1.0 1
three 3.0 3
two 2.0 2
數據結構操作(舉例)
列訪問
DataFrame的單列數據爲一個Series。根據DataFrame的定義可以知曉DataFrame是一個帶有標籤的二維數組,每個標籤相當每一列的列名。
- 例子
①訪問單列
代碼:
import pandas as pd
data = {'A':pd.Series([1, 2, 3], index = ['one', 'two', 'three']),
'B':pd.Series([1, 2, 3, 4], index = ['one', 'two', 'three', 'four']),
'C':pd.Series([6, 7, 8, 9], index = ['one', 'two', 'three', 'four'])}
df = pd.DataFrame(data)
#print('-'*10)
print(df['A'], '\n',type(df['A']))
結果:
four NaN
one 1.0
three 3.0
two 2.0
Name: A, dtype: float64
<class 'pandas.core.series.Series'>
②訪問多列
代碼:
import pandas as pd
data = {'A':pd.Series([1, 2, 3], index = ['one', 'two', 'three']),
'B':pd.Series([1, 2, 3, 4], index = ['one', 'two', 'three', 'four']),
'C':pd.Series([6, 7, 8, 9], index = ['one', 'two', 'three', 'four'])}
df = pd.DataFrame(data)
print(df[['C', 'B']])
結果:
C B
four 9 4
one 6 1
three 8 3
two 7 2
列添加
DataFrame添加一列的方法非常簡單,只需要新建一個列索引。並對該索引下的數據進行賦值操作即可。
- 例子
代碼:
import pandas as pd
data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15]}
df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])
df['weight'] = pd.Series([8, 4, 5, 6],
index = ['a1', 'a2', 'a3', 'a4'])
print(df)
結果:
age name weight
a1 9 Ada 8
a2 19 Tom 4
a3 12 Black 5
a4 15 Jack 6
列刪除
刪除某列數據需要用到pandas提供的方法pop()。
- 例子
代碼:
import pandas as pd
data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}
df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])
print(df)
print('-'*20)
#del 方法,刪除一列
del(df['weight'])
print(df)
print('-'*20)
#pop方法,刪除一列
df.pop('hight')
print(df)
結果:
age hight name weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6
--------------------
age hight name
a1 9 20 Ada
a2 19 35 Tom
a3 12 30 Black
a4 15 33 Jack
--------------------
age name
a1 9 Ada
a2 19 Tom
a3 12 Black
a4 15 Jack
行訪問
- 例子1(切片
:
)
代碼:
import pandas as pd
data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}
df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])
print(df)
print('-'*20)
print(df[1:3])
結果:
age hight name weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6
--------------------
age hight name weight
a2 19 35 Tom 4
a3 12 30 Black 5
- 例子2(
loc
方法)
loc方法是針對DataFrame索引名稱的切片方法,在下面的例子中,我們演示一下loc方法的使用。
代碼:
import pandas as pd
data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}
df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])
print(df)
print('-'*20)
print(df.loc['a2'], '\n',type(df.loc['a2']))
print('-'*20)
print(df.loc[['a1', 'a3']])
結果:
age hight name weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6
--------------------
age 19
hight 35
name Tom
weight 4
Name: a2, dtype: object
<class 'pandas.core.series.Series'>
--------------------
age hight name weight
a1 9 20 Ada 8
a3 12 30 Black 5
備註:只獲取一行,則拿到的是Series。
- 例子3(
iloc
方法)
iloc方法和loc區別是iloc接受的必須是行索引和列索引的下標,在下面的例子中,我們演示一下loc方法的使用。
代碼:
import pandas as pd
data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}
df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])
print(df.iloc[2])
print('-'*20)
print(df.iloc[[1, 3]])
結果:
age 12
hight 30
name Black
weight 5
Name: a3, dtype: object
--------------------
age hight name weight
a2 19 35 Tom 4
a4 15 33 Jack 6
行添加
- 例子
代碼:
import pandas as pd
df1 = pd.DataFrame([['Huang', 7], ['Bai', 8]],
columns = ['name', 'age'])
df2 = pd.DataFrame([['Bunny', 5], ['Tim', 9]],
columns = ['name', 'age'])
print(df1)
print('-'*15)
df = df1.append(df2)
print(df)
print('-'*15)
print(df.loc[0])
結果:
name age
0 Huang 7
1 Bai 8
---------------
name age
0 Huang 7
1 Bai 8
0 Bunny 5
1 Tim 9
---------------
name age
0 Huang 7
0 Bunny 5
由結果可知,進行行添加後,行標會出現重複的狀況,如果按照行標進行行查詢,則可能會找到多行數據。我們可以重建索引,解決索引重複問題。
行刪除
使用索引標籤從DataFrame中刪除或者刪除行。如果標籤重複,則會刪除多行。
- 例子
代碼:
import pandas as pd
df1 = pd.DataFrame([['Huang', 7], ['Bai', 8]],
columns = ['name', 'age'])
df2 = pd.DataFrame([['Bunny', 5], ['Tim', 9]],
columns = ['name', 'age'])
df = df1.append(df2)
print(df)
print('-'*15)
#刪除index爲1的行
df = df.drop(1)
print(df)
結果:
name age
0 Huang 7
1 Bai 8
0 Bunny 5
1 Tim 9
---------------
name age
0 Huang 7
0 Bunny 5
修改DataFrame中的數據
更改DataFrame中的數據,原理是將要修改的這部分數據提取出來,重新賦值爲新的數據.
- 例子
代碼:
import pandas as pd
df = pd.DataFrame([['Huang', 7], ['Bai', 8],
['Black', 9]],
columns = ['name', 'age'])
print(df)
print('-'*15)
df['name'][2] = 'Tim'
print(df)
備註:df["Name"][2]
是先拿到name列(Series類型),再拿到第3行。
結果:
name age
0 Huang 7
1 Bai 8
2 Black 9
---------------
name age
0 Huang 7
1 Bai 8
2 Tim 9
DataFrame常用屬性
編號 | 屬性或方法 | 描述 |
---|---|---|
1 | axes |
返回 行/列 標籤(index)列表。 |
2 | dtype |
返回對象的數據類型(dtype )。 |
3 | empty |
如果Series爲空,則返回True 。 |
4 | ndim |
返回底層數據的維數,默認定義:1 。 |
5 | size |
返回基礎數據中的元素數。 |
6 | values |
將系列作爲ndarray 返回。 |
7 | head() |
返回前n 行。 |
8 | tail() |
返回最後n 行。 |
- 例子
代碼:
import pandas as pd
data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}
df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])
print(df, '\n')
print(df.axes, '\n')
print(df['age'].dtype, '\n')
print(df.empty, '\n')
print(df.ndim, '\n')
print(df.size, '\n')
print(df.values, '\n')
print(df.head(3), '\n') # df的前三行
print(df.tail(3), '\n') # df的後三行
結果:
age hight name weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6
[Index(['a1', 'a2', 'a3', 'a4'], dtype='object'), Index(['age', 'hight', 'name', 'weight'], dtype='object')]
int64
False
2
16
[[9 20 'Ada' 8]
[19 35 'Tom' 4]
[12 30 'Black' 5]
[15 33 'Jack' 6]]
age hight name weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5
age hight name weight
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6
- 例子2(describe)
代碼1:
import pandas as pd
data = {'name':['Ada', 'Tom','Black', 'Jack', 'Bai'],
'age':[9, 19, 12, 15, 10],
'weight':[8, 4, 5, 6, 7],
'hight':[20, 35, 30, 33, 28]}
df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4', 'a5'])
print(df.describe())
結果1:
age hight weight
count 5.000000 5.00000 5.000000
mean 13.000000 29.20000 6.000000
std 4.062019 5.80517 1.581139
min 9.000000 20.00000 4.000000
25% 10.000000 28.00000 5.000000
50% 12.000000 30.00000 6.000000
75% 15.000000 33.00000 7.000000
max 19.000000 35.00000 8.000000
由結果可知,df.describe()
將數值型數據的統計量計算出來了。
代碼2:
print(df.describe(include = ['object']))
結果2:
name
count 5
unique 5
top Jack
freq 1
由結果可知,df.describe(include = [“object”])
是對分類型(這裏不是很確定,標記一下) 的數據進行描述性統計分析。
代碼3:
print(df.describe(include = ['number']))
結果3:
age hight weight
count 5.000000 5.00000 5.000000
mean 13.000000 29.20000 6.000000
std 4.062019 5.80517 1.581139
min 9.000000 20.00000 4.000000
25% 10.000000 28.00000 5.000000
50% 12.000000 30.00000 6.000000
75% 15.000000 33.00000 7.000000
max 19.000000 35.00000 8.000000
由結果可知df.describe(include = [“number”])
是對數值型的數據進行描述性統計分析,上述結果與結果1相同。
代碼4:
print(df.describe(include = ['number', 'object']))
結果4:
age hight name weight
count 5.000000 5.00000 5 5.000000
unique NaN NaN 5 NaN
top NaN NaN Bai NaN
freq NaN NaN 1 NaN
mean 13.000000 29.20000 NaN 6.000000
std 4.062019 5.80517 NaN 1.581139
min 9.000000 20.00000 NaN 4.000000
25% 10.000000 28.00000 NaN 5.000000
50% 12.000000 30.00000 NaN 6.000000
75% 15.000000 33.00000 NaN 7.000000
max 19.000000 35.00000 NaN 8.000000
結果4基本上可以說,是結果2和結果3的堆疊。