1. 程式人生 > >【python學習筆記】40:Pandas中DataFrame的分組/分割/合併

【python學習筆記】40:Pandas中DataFrame的分組/分割/合併

學習《Python3爬蟲、資料清洗與視覺化實戰》時自己的一些實踐。


DataFrame分組操作

注意分組後得到的就是Series物件了,而不再是DataFrame物件。

import pandas as pd

# 還是讀取這份檔案
df = pd.read_csv("E:/Data/practice/taobao_data.csv", delimiter=',', encoding='utf-8', header=0)

# 計算'成交量'按'位置'分組的平均值
grouped1 = df['成交量'].groupby(df['位置']).mean()
# print(grouped1)

在這裡插入圖片描述

# 計算'成交量'先按'位置'再按'賣家'分組後的平均值
grouped2 = df['成交量'].groupby([df['位置'], df['賣家']]).mean()
# print(grouped2)

在這裡插入圖片描述

# 計算先按'位置'再按'賣家'分組後的所有指標(如果可以計算平均值)的平均值
grouped3 = df.groupby([df['位置'], df['賣家']]).mean()
# print(grouped3)

在這裡插入圖片描述

DataFrame資料分割和合並

這裡其實可以操作得很複雜,這裡是一些比較基本的用法。

import pandas as pd

# 還是讀取這份檔案
df = pd.read_csv("E:/Data/practice/taobao_data.csv", delimiter=',', encoding='utf-8', header=0) # 計算銷售額 df['銷售額'] = df['價格'] * df['成交量'] # (1)前面學了ix,loc,iloc,這裡是直接用[]運算做分割 df1 = df[30:40][['位置', '賣家']] # print(df1) # 從30號行到39號行 df2 = df[80:90][['賣家', '銷售額']]

在這裡插入圖片描述

# (2)內聯接操作(相當於JOIN,INNER JOIN)
df3 = pd.merge(
df1, df2) # 不指定列名,預設選擇列名相同的'賣家'列 # print(df3) df4 = pd.merge(df1, df2, on='賣家') # 指定按照'賣家'相同做聯接 # print(df4)

在這裡插入圖片描述

# (3)全外聯接操作(相當於FULL JOIN),沒有值的補NaN
df5 = pd.merge(df1, df2, how='outer')
# print(df5)

在這裡插入圖片描述

# (4)左外聯接操作(相當於LEFT JOIN),即左邊的都要,'銷售額'沒有就NaN
df6 = pd.merge(df1, df2, how='left')
# print(df6)

在這裡插入圖片描述

# (5)右外聯接操作(相當於RIGHT JOIN),即右邊的都要,'位置'沒有就NaN
df7 = pd.merge(df1, df2, how='right')
# print(df7)

在這裡插入圖片描述

# (6)按索引相同做聯接
df_a = df[:10][['位置', '賣家']]
df_b = df[3:13][['價格', '成交量']]
df_c_1 = pd.merge(df_a, df_b, left_index=True, right_index=True)  # 內聯接
# print(df_c_1)  # 只有從3到9的

在這裡插入圖片描述

df_c_2 = df_a.join(df_b)  # 左外聯接
# print(df_c_2)  # 從0到10

在這裡插入圖片描述

df_c_3 = df_b.join(df_a)  # "右"外聯接(其實還是左外聯接,就是b在左邊a在右邊)
# print(df_c_3)  # 從3到12

在這裡插入圖片描述

# (7)軸向堆疊操作(上下堆疊時就相當於UNION ALL,預設不去重)
df8 = df[2:5][['價格']]  # 注意這裡只取一個列也要用[[]]
df9 = df[3:8][['銷售額', '寶貝']]
df10 = df[6:11][['賣家', '位置']]
# (7.1)預設axis=0即上下堆疊,上下堆疊時,堆疊順序和傳進concat的順序一致,最終列=所有列數去重,缺失的補NaN
# 關於axis=0需要設定sort屬性的問題,還沒查到有講這個的,這個問題先留著...
df11 = pd.concat([df10, df9, df8], sort=False)
# print(df11)

在這裡插入圖片描述

# (7.2)設定axis=1即左右堆疊,左右堆疊不允許索引重複,相同索引的將被合併到一行
# 左右堆疊中,堆疊順序僅僅影響列的出現順序
# 這很好理解,畢竟不是從上到下"摞"在一起的,而是從左到右"卡"在一起的
df12 = pd.concat([df10, df9, df8], axis=1)
df13 = pd.concat([df8, df9, df10], axis=1)
# print(df12)
# print(df13)

在這裡插入圖片描述
在這裡插入圖片描述