iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
0
AI & Data

python 入門到分析股市系列 第 12

[Day12]Learning Pandas - 資料合併

導讀

前言

今天是第12天,還在Pandas....,主要是介紹Pandas裡面資料合併,Pandas學習的時間比我想中還長


資料合併Concat、Append、Merge、Join

  • Concat
    示範用Series串接資料(會保留重複index)
ironman1 = pd.Series(['A','B','C'], index=[0,1,2])
ironman2 = pd.Series(['D','E','F'], index=[2,3,4])
pd.concat([ironman1,ironman2])
# 輸出結果,可以看到有重複的index->2
0    A
1    B
2    C
2    D
3    E
4    F
dtype: object

示範用DataFrame串接資料

# 先定義一個function
def make_dataFrame(cols, ind):
    data = {c:[str(c) + str(i) for i in ind]
                               for c in cols}
    return pd.DataFrame(data, ind)
ironman3 = make_dataFrame('AB',[1,2])
ironman4 = make_dataFrame('AB',[3,4])
pd.concat([ironman3,ironman4])
# 輸出結果
	A	B
1	A1	B1
2	A2	B2
3	A3	B3
4	A4	B4

合併資料可採取使用join,outer->聯集、inner->交集(如果資料不存在時有NaN時)

ironman5 = make_dataFrame('BC',[3,4])
print(ironman3)
print(ironman5)
print(pd.concat([ironman3,ironman5], join='inner'))
# 輸出結果,因為ironman3沒有columns C 而 ironman5沒有columns A,所以使用inner(交集)合併時,只會留下columns B

    A   B
1  A1  B1
2  A2  B2
    B   C
3  B3  C3
4  B4  C4
    B
1  B1
2  B2
3  B3
4  B4
  • Append: 等同Concat只是呼叫更簡單
    用上述ironman1和ironman2作範例
ironman1.append(ironman2)
# 輸出結果
0    A
1    B
2    C
2    D
3    E
4    F
dtype: object

*merge: 也是合併資料的一種,但可以有更多的應用ex: join

ironman6 = pd.DataFrame({'player':['彭政閔','林智勝','郭阜林','詹子賢'],
                        'number':[23,32,5,39]})
ironman7 = pd.DataFrame({'player':['彭政閔','郭阜林','林智勝','詹子賢'],
                        'team':['兄弟象','統一獅','兄弟象','兄弟象']})
ironman8 = pd.merge(ironman6, ironman7)
ironman8
# 輸出結果
player	number	team
0	彭政閔	23	兄弟象
1	林智勝	32	兄弟象
2	郭阜林	5	統一獅
3	詹子賢	39	兄弟象

多對一join

ironman9 = pd.DataFrame({'team':['兄弟象','統一獅','lamigo','富邦悍將'],
                        'manager':['Snyder','黃甘霖','洪一中','陳連宏']})
ironman10 = pd.merge(ironman8, ironman9)
ironman10
# 輸出結果
	player	number	team	manager
0	彭政閔	   23	兄弟象	   Snyder
1	林智勝	   32	兄弟象	   Snyder
2	詹子賢	   39	兄弟象	   Snyder
3	郭阜林	   5	統一獅	   黃甘霖

多對多join

ironman11 = pd.DataFrame({'team':['兄弟象','兄弟象','統一獅','lamigo','富邦悍將'],
                        'coach':['伯 納','丘昌榮','高政華','吳俊良','林宗男']})
ironman12 = pd.merge(ironman8, ironman11)
ironman12
# 輸出結果
	player	number	team	coach
0	彭政閔	  23	兄弟象	   伯 納
1	彭政閔	  23	兄弟象	   丘昌榮
2	林智勝	  32	兄弟象	   伯 納
3	林智勝	  32	兄弟象	   丘昌榮
4	詹子賢	  39	兄弟象	   伯 納
5	詹子賢	  39	兄弟象	   丘昌榮
6	郭阜林	  5	    統一獅	   高政華

當兩邊index不一樣時可以使用left_on和right_on來指定merge的index

ironman6 = pd.DataFrame({'player':['彭政閔','林智勝','郭阜林','詹子賢'],
                        'number':[23,32,5,39]})
ironman13 = pd.DataFrame({'name':['彭政閔','郭阜林','林智勝','詹子賢'],
                        'team':['兄弟象','統一獅','兄弟象','兄弟象']})
pd.merge(ironman6, ironman13, left_on="player", right_on="name").drop('name',axis=1)
# 輸出結果,將重複的column「name」使用drop語法刪除。

      player	number	team
0	彭政閔	      23	兄弟象
1	林智勝	      32	兄弟象
2	郭阜林	       5	統一獅
3	詹子賢	      39	兄弟象

在merge中使用inner(交集)、outer(聯集)、lqft(左),(right)右

ironman6 = pd.DataFrame({'player':['彭政閔','林智勝','郭阜林','詹子賢'],
                        'number':[23,32,5,39]})
ironman14 = pd.DataFrame({'player':['彭政閔','林智勝','張志豪',"藍寅倫"],
                        'team':['兄弟象','兄弟象','兄弟象','lamigo']})
pd.merge(ironman6, ironman14, how="outer")
# 輸出結果(缺失的資料用NaN帶入)
       player	number	  team
0	   彭政閔	  23.0	  兄弟象
1	   林智勝	  32.0	  兄弟象
2	   郭阜林	  5.0	    NaN
3	   詹子賢	  39.0	    NaN
4	   張志豪	  NaN	  兄弟象
5	   藍寅倫	  NaN	  lamigo

當欄位名稱相同時使用suffixes來改變欄位名稱

ironman6 = pd.DataFrame({'player':['彭政閔','林智勝','陳江和','張正偉'],
                        'number':[23,32,31,8]})
ironman15 = pd.DataFrame({'player':['彭政閔','林智勝','陳江和','張正偉'],
                        'number':[23,31,8,59]})
pd.merge(ironman6,ironman15, on="player", suffixes=["_職棒","_國家隊"])
# 輸出結果(缺失的資料用NaN帶入)
	player	number_職棒	number_國家隊
0	 彭政閔	   23	        23
1	 林智勝	   32	        31
2	 陳江和	   31	         8
3	 張正偉	    8	        59

上一篇
[Day11]Learning Pandas - 處理空值的資料和使用多重index
下一篇
[Day13]Learning Pandas - 處理資料分組
系列文
python 入門到分析股市30

尚未有邦友留言

立即登入留言