Python常用庫之二:Pandas


Pandas是用於數據操縱和分析,建立在Numpy之上的。Pandas為Python帶來了兩種新的數據結構:Pandas SeriesPandas DataFrame,借助這兩種數據結構,我們能夠輕松直觀地處理帶標簽數據關系數據

Pandas功能:

  • 允許為行和列設定標簽
  • 可以針對時間序列數據計算滾動統計學指標
  • 輕松處理NaN值
  • 能夠將不同的數據集合並在一起
  • 與Numpy和Matplotlib集成

Pandas Series

Pandas series 是像數組一樣的一維對象,可以存儲很多類型的數據。Pandas series 和 Numpy array之間的主要區別之一是你可以為Pandas series 中的每個元素分配索引標簽;另一個區別是Pandas series 可以同時存儲不同類型的數據。

創建 Pandas Series

pd.Series(data, index)

 

1 groceries = pd.Series(data=[30, 6, 'yes', 'No'], index=['eggs', 'apples', 'milk', 'bread'])
2 ser = pd.Series(data=[[0, 1, 2, 3], [1, 3, 5, 7], [2, 4, 6, 8]], index=(['a', 'b', 'c']))

 

查看 Pandas Series 屬性

 1 # Pandas Series 元素數量
 2 print(groceries.size)
 3 # Pandas Series 形狀
 4 print(groceries.shape)
 5 # Pandas Series 維度
 6 print(groceries.ndim)
 7 # Pandas Series 索引列表
 8 print(groceries.index)
 9 # Pandas Series 元素列表
10 print(groceries.values)

查看是否存在某個索引標簽:in

1 print('book' in groceries)

 訪問 Pandas Series 中元素

Pandas Series 提供了兩個屬性 .loc.iloc

.loc 表明我們使用的是標簽索引訪問

.iloc 表明我們使用的是數字索引訪問

 1 # 標簽索引
 2 print(groceries['eggs'])
 3 print(groceries[['eggs', 'milk']])
 4 # 數字索引
 5 print(groceries[1])
 6 print(groceries[[1, 2]])
 7 print(groceries[-1])
 8 # 明確標簽索引
 9 print(groceries.loc['milk'])
10 print(groceries.loc[['eggs', 'apples']])
11 # 明確數字索引
12 print(groceries.iloc[0])
13 print(groceries.iloc[[0, 1]])

修改和刪除 Pandas Series 中元素

直接標簽訪問,值修改就可

1 groceries['eggs'] = 2
2 print(groceries)

刪除:drop(參數 1:lable,標簽;參數 2:inplace=True/False,是/否修改原 Series)

1 print(ser.drop(['b']))
2 print(ser.drop(['a', 'b'], inplace=True))

Pandas Series 中元素執行算術運算

Pandas Series執行元素級算術運算:加、減、乘、除

fruits = pd.Series(data=[10, 6, 3], index=['apples', 'oranges', 'bananas'])
# 所有數字進行運算
print(fruits + 2)
print(fruits - 2)
print(fruits * 2)
print(fruits / 2)
# 所有元素應用Numpy中的數學函數
print(np.exp(fruits))
print(np.sqrt(fruits))
print(np.power(fruits, 2))
# 部分元素進行運算
print(fruits[0] - 2)
print(fruits['apples'] + 2)
print(fruits.loc['oranges'] * 2)
print(np.power(fruits.iloc[0], 2))

 Pandas DataFrame

Pandas DataFrame 是具有帶標簽的行和列的二維數據結構,可以存儲多種類型的數據,類似於電子表格。

創建 Pandas DataFrame

第一步:創建 Pandas Series 字典

第二步:將字典傳遞給 pd.DataFrame

1 items = {'Bob': pd.Series(data=[245, 25, 55], index=['bike', 'pants', 'watch']),
2          'Alice': pd.Series(data=[40, 110, 500, 45], index=['book', 'glasses', 'bike', 'pants'])}
3 shopping_carts = pd.DataFrame(items)
4 print(shopping_carts)

通過關鍵字 columnsindex 選擇要將哪些數據放入 DataFrame 中

1 shopping_cart = pd.DataFrame(items, index=['bike', 'pants'], columns=['Bob'])
2 print(shopping_cart)

 訪問、添加、刪除 DataFrame

訪問整列:dataframe[['column1', 'column2']]

1 # 讀取列
2 print(shopping_carts[['Bob', 'Alice']])

訪問整行:dataframe.loc[['row1', 'row2']]

1 # 讀取行
2 print(shopping_carts.loc[['bike']])

訪問某行某列:dataframe['column']['row'],先提供行標簽,將出錯。

1 # 讀取某一列某一行
2 print(shopping_carts['Bob']['bike'])

添加整列(末尾添加列),空值用 None

1 # 添加列
2 shopping_carts['Mike'] = [10, 30, 10, 90, None]

添加整行(末尾添加行),把新添加行創建為 dataframe,通過 append() 添加

1 # 添加行
2 new_items = [{'Alice': 30, 'Bob': 20,  'Mark': 35, 'Mike': 50}]
3 new_store = pd.DataFrame(new_items, index=['store3'])
4 shopping_carts = shopping_carts.append(new_store)

只能刪除整列:pop('lable')

1 # 刪除整列
2 shopping_carts.pop('Jey')

刪除行或者列:drop(['lable1', 'lable2'], axis=0/1)  0表示行,1表示列

1 # 刪除行
2 shopping_carts = shopping_carts.drop(['store3', 'watch'], axis=0)

更改行和列標簽

rename()

1 # 更改列標簽
2 shopping_carts = shopping_carts.rename(columns={'Bob': 'Jey'})
3 # 更改行標簽
4 shopping_carts = shopping_carts.rename(index={'bike': 'hats'})

處理 NaN

統計 NaN 數量:isnull().sum().sum

1 # 數值轉化為 True 或者 False
2 print(store_items.isnull())
3 # 每一列的 NaN 的數量
4 print(store_items.isnull().sum())
5 # NaN 總數
6 print(store_items.isnull().sum().sum())

統計非 NaN 數量:count(axis=0/1)

1 # 每一行非 NaN 的數量,通過列統計
2 print(store_items.count(axis=1))
3 # 每一列非 NaN 的數量,通過行統計
4 print(store_items.count(axis=0))

刪除具有NaN值的行和列:dropna(axis=0/1, inplace=True/False)  inplace默認False,原始DataFrame不會改變;inplace為True,在原始DataFrame刪除行或者列

1 # 刪除包含NaN值的任何行
2 store_items.dropna(axis=0)
3 # 刪除包含NaN值的任何列
4 store_items.dropna(axis=1, inplace=True)

將 NaN 替換合適的值:fillna()

1 # 將所有 NaN 替換為 0
2 store_items.fillna(value=0)
3 # 前向填充:將 NaN 值替換為 DataFrame 中的上個值,axis決定列或行中的上個值
4 store_items.fillna(method='ffill', axis=1)
5 # 后向填充:將 NaN 值替換為 DataFrame 中的下個值,axis決定列或行中的下個值
6 store_items.fillna(method='backfill', axis=0)

 加載數據

csv 格式文件,每一行都是用逗號隔開:read_csv()

1 # 讀取 csv 文件,第一行作為列標簽
2 data = pd.read_csv('data.csv')
3 print(data)
4 print(data.shape)
5 print(type(data))

讀取前 N 行數據:head(N)

1 # 讀取頭 3 行數據
2 print(data.head(3))

讀取最后 N 行數據:tail(N)

1 # 讀取后 5 行數據
2 print(data.tail(5))

檢查是否有任何列包含 NaN 值:isnull().any()  類型 bool

1 # 檢查任何列是否有 NaN 值,返回值:bool
2 print(data.isnull().any())

數據集的統計信息:describe()

1 # 獲取 DataFrame 每列的統計信息:count,mean,std,min,25%,50%,75%,max
2 # 25%:四分之一位數;50%:中位數;75%:四分之三位數
3 print(data.describe())
4 # 通過統計學函數查看某個統計信息
5 print(data.max())
6 print(data.median())

數據相關性:不同列的數據是否有關聯,1 表明關聯性很高,0 表明數據不相關。corr()

1 # 數據相關性
2 print(data.corr())

數據分組:groupby(['lable1', 'lable2'])

1 # 按年份分組,統計總薪資
2 data.groupby(['Year'])['Salary'].sum()
3 # 按年份分組,統計平均薪資
4 data.groupby(['Year'])['Salary'].mean()
5 # 按年份,部門分組,統計總薪資
6 data.groupby(['Year', 'Department'])['Salary'].sum()

 


免責聲明!

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



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