Pandas:Series和DataFrame數據結構詳解


前言

pandas中包含的數據結構共有三種:

1、Series

2、DataFrame

3、Time-series

其中Series和DataFrame是兩種常見的數據結構,Time-series為時間序列,這里暫且不去詳細講解。

 

一、Series

Series是一維數組,與Numpy中的一維array類似。二者與Python基本的數據結構List也很相近,其區別是:List中的元素可以是不同的數據類型,而Array和Series中則只允許存儲相同的數據類型,這樣可以更有效的使用內存,提高運算效率,並且series可以運用Ndarray或字典的幾乎所有索引操作和函數,融合了字典和ndarray的優點。

1、series索引

Series類型是由一組數據及與之相關的數據索引組成

· 自動索引:不創建系統自動創建索引。

· 自定義索引:自定義索引,創建完自定義索引后,自動索引也在。

Series可以理解是一維帶‘標簽’數組,它的基本操作類似Ndarray和字典,genuine索引對齊。

2、對象創建

Series(列表/元組/字典/標量/Numpy數組/range等序列, <index=param1>)

不寫index會自動創建索引,如果寫定指定索引,index可以是列表,numpy數組。

例:

import pandas as pd
a = pd.Series([1, 2, 3], index=range(0, 3))
b = pd.Series(range(5, 10))

3、屬性

Series的主要屬性包括index和values兩部分,values獲取數據,底層存儲的是numpy數組;index獲取索引。

另外,Series還有兩個不太重要的屬性,series.name和index.name,分別表示series的名字和索引的名字。同時,series還有一些類似於numpy數組的屬性,比如dtype和shape等。

例:

import pandas as pd
a = pd.Series([1, 2, 3], index=range(0, 3))
b = pd.Series(range(5, 10))
​
a.name = 'x_a'
b.name = 'x_b'
​
a.index.name = 'y_a'
b.index.name = 'y_b'print(a.values)
print(b.index)
print(a.name)
print(b.index.name)

4、類型選取

series類型的選取類似numpy數組,索引的方式相同,采用[],numpy中的運算和操作可用於series類型,可以通過自定義索引的列表進行切片也可以通過自動索引進行切片,如果存在自定義索引,則一同被切片。

series類型的操作類似於python字典類型:通過自定義索引訪問,保留字in操作,使用get()方法,get(key, default=none)函數返回指定鍵的值,如果值不再字典中則返回默認值(默認為空),key是要查找的鍵,default是設置的默認值。

5、Series類型對齊操作

series類型在運算中會自動對齊不同索引的數據,例如:

import pandas as pd
a = pd.Series([1, 2, 3], index=range(0, 3))
b = pd.Series(range(5, 10))
​
print(a + b)

6、數據的獲取、修改、刪除

① 數據的獲取

由於具備numpy數組和字典的特性,series可以像使用numpy數組的索引切片或用字典的get一樣來用,例如:

import pandas as pd
a = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
​
print(a[1])
print(a['a'])
print(a.get('c'))

② 數據的修改

對於series結構一般采用索引和切片的方式修改數據,例如:

import pandas as pd
a = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
​
a['a'] = 10
a['b':'c'] = 100
print(a)
a['a', 'c'] = 7
print(a)
​
'''
其中,使用“:”切片時,是修改從index1-index2的所有數據;
使用“,"時,是將index1和index2單獨取出來進行修改。
'''

③ 數據的刪除

可使用drop方法和pop方法刪除數據。使用drop方法則結果改變,使用pop方法則像字典的用法,改變自身。

例如:

import pandas as pd
a = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
​
print(a.drop('a'))
print(a.drop(['b', 'd']))
​
b = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
print(b.pop('a'))   # 返回操作狀態,成功為True
print(b)

二、DataFrame

DataFrame類型由公用相同索引的一組序列組成,是一個表格型的數據類型,每列值類型可以不同。DataFrame即有行索引也有列索引:Index axis = 0(默認)、Column axis = 1(默認)。

DataFrame常用於表達二維數據,但可以表達多維數據,基本操作類似於Series,依據行列索引。

1、DataFrame的創建

① 從內存中創建

DataFrame(字典/列表/numpy數組/DataFrame, index=0, columns=1)

說明:在創建的時候也可以不指定index和columns,在創建完后單獨設置這兩個屬性。

參數:

  • 字典 - key作為列名,value作為該列的值。

  • 列表 - 作為值

  • Numpy數組 - 作為值

例:

import pandas as pd
​
# 說明:數組也可以使用numpy生成,這里只演示手動輸入數組
a = pd.DataFrame([
    [1, 2],
    [3, 4]
])
print(a)
​
b = pd.DataFrame([
    [1, 2],
    [3, 4]
], index=['a', 'b'], columns=['x', 'y'])
print(b)
​
c = pd.DataFrame([
    [1, 2],
    [3, 4]
])
c.index = ['c', 'd']
c.columns = ['z', 'w']
print(c)

② 從文件中創建

DataFrame可以從文件中創建:文件第一行默認作為列索引(columns),默認為沒有行索引,可以通過indx_dol參數設置第1列或前幾行作為行索引。如果第一行不作為列索引,設置 header=None 。文件編碼為utf-8,可以通過參數encoding設置編碼。

例如:

pd.read_table(filename, sep='\t')       # 從限定分隔符的文本文件導入數據,默認是tab
pd.read_csv(filename)                   # 從CSV文件導入數據, 文件是逗號分隔
pd.read_excel(filename)                 # 從Excel文件導入數據
pd.read_sql(query, connection_object)   # 從SQL表/庫導入數據
pd.read_json(json_string)               # 從json格式字符串導入數據
pd.read_html(url)                       # 解析url、字符串或者html文件,抽取其中的tables表格
pd.read_clipboard()                     # 從你的粘貼板獲取內容,傳給read_table()

同時注意,從文件讀取的時候可以可以帶行索引,用 index_col=num ,例如:a = pd.read_csv('filename', encoding='utf-8', index_col=0)。若不把第一行作為列索引(有些情況下文件中全部都是數據沒有存儲索引)則可以這樣編寫代碼:a = pd.read_csv('filename', header=None)。若想查看DataFrame的信息,可以使用info方法,如圖:

2、DataFrame數據寫入文件

df.to_csv(filename)                         # 導出數據到CSV文件
df.to_excel(filename)                       # 導出數據到Excel文件
df.to_sql(table_name, connection_object)    # 導出數據到SQL表
df.to_json(filename)                        # 以Json格式導出數據到文本文件

若將行索引和列索引寫入文件,則df.to_csv(filename)后面不帶任何參數;若行索引不寫入,則df.to_csv(filename, index=False);若行列索引都不寫入,則df.to_csv(filename, index=False, header=False)

3、DataFrame的屬性

values表示值,index表示行索引,columns表示列索引,index.name表示行索引名字,columns.name表示列索引名字,其他屬性:dtypes,shape等,DataFrame同樣擁有類似於numpy數組的大部分屬性。

例:

import pandas as pd
​
a = pd.DataFrame([
    [1, 2],
    [3, 4]
], index=['n', 'm'], columns=['x', 'y'])
print(b)
print(a.values)
print(a.columns)
print(a.index)
print(a.columns.name)
print(a.index.name)
print(a.shape)

4、DataFrame中的函數和方法

4.1 取值和修改(索引,切片,ix,loc,iloc)

DataFrame的取值和修改應該從三個層次考慮:行列,區域,單元格。每個層次都有其對應的方法:行列df[]df.ix,區域df.ix[],單元格df.ix,其中ix官方推薦使用iloc和loc代替,loc和iloc的用法和ix基本一樣,只是loc參數用手動索引,iloc用自動索引,ix為混用。

4.2 其他函數

查看數據:

df.head(n)          # 查看前n行
df.tail(n)          # 查看后n行
df.shape            # 查看行數和列數
df.info()           # 查看索引、數據類型和內存信息
df.describe()       #  查看數值型列的匯總統計
df.apply(def_name)  # 把df應用於某個函數
# s.value_counts(dropna=False)  # 查看Series對象的唯一值和計數

清洗數據:

df.columns = [...]  # 重命名列名
df.index = [...]
df.isnull()         # 檢查DataFrame對象中的空值,並返回一個Boolean數組
df.notnull()        # 檢查DataFrame對象中的非空值,並返回一個Boolean數組
df.dropna()         # 刪除所有包含空值的行
df.dropna(axis=1)   # 刪除所有包含空值的列
df.fillna(x)        # 用x替換DataFrame對象中所有的空值
df.set_index('column_one')                      # 更改索引列
df.dropna(axis=1, thresh=n)                     # 刪除所有小於n個非空值的列
df.rename(columns=lambda x: x + '1')            # 批量更改列名
df.rename(columns={'old_name': 'new_ name'})    # 選擇性更改列名
df.rename(index=lambda x: x + 1)                # 批量重命名索引

數據規整:

df[df[col] > 0.5]       # 選擇col列的值大於0.5的行
df.sort_values(col1)    # 按照列col1排序數據, 默認升序排列
df.sort_values(col2, ascending=False)                   # 按照列col1降序排列數據
df.sort_values([col1, col2], ascending=[True, False])   # 先按列col1升序排列,后按col2降序排列數據
df.groupby(col)                 # 返回一個按列col進行分組的Groupby對象
df.groupby([col1, col2])        # 返回一個按多列進行分組的Groupby對象
df.groupby(col1).agg(np.mean)   # 返回按列col1分組的所有列的均值
df.groupby(col1).sum()          # 返回按列col1分組的所有列的和
df.groupby(col1).mean()[col2]   # 返回按列col1進行分組后,列col2的均值
data.apply(np.mean)             # 對DataFrame中的每一列應用函數np.mean
data.apply(np.max, axis=1)      # 對DataFrame中的每一行應用函數np.max
# 創建一個按列col1進行分組,並計算col2和col3各自均值的數據透視表
df.pivot_table(index=col1, values=[col2, col3], aggfunc=np.mean)
pd.crosstab(df.col1, df.col2)   # 按照指定的行(col1)和列(col2)統計分組頻數

數據合並:

df1.append(df2)                 # 將df2中的行添加到df1的尾部
pd.concat([df1, df2], axis=0)   # 將df2中的行添加到df1的底部(axis=1的時候將df2的列添加到df1的尾部)

數據統計:

df.describe()       # 查看數據值列的匯總統計
df.mean()           # 返回所有列的均值
df.corr()           # 返回列與列之間的相關系數
df.count()          # 返回每一列中的非空值的個數
df.max()            # 返回每一列的最大值
df.min()            # 返回每一列的最小值
df.median()         # 返回每一列的中位數
df.std()            # 返回每一列的標准差
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM