pandas基礎(part2)--DataFrame

學習筆記,這個筆記以例子爲主。
開發工具: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的堆疊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章