2020-11-21

獲取數據后,需要對數據進行合并,通常是日期,也有對相同公司進行合并

下面就研究數據合并的常用方法:

目錄

  • append
  • merge
    • on屬性
    • how屬性(inner,outer,left , right)
    • indicator
  • concat
    • axis
    • join
    • ~~join_axes~~ 現已刪除
    • ignore_index
    • keys
    • levels
    • sort

首先創建幾個DataFrame,作為樣本材料進行練習:

df1 = pd.DataFrame(np.ones((4, 4))*1, columns=list(‘DCBA’), index=list(‘4321’))
df2 = pd.DataFrame(np.ones((4, 4))*2, columns=list(‘FEDC’), index=list(‘6543’))
df3 = pd.DataFrame(np.ones((4, 4))*3, columns=list(‘FEBA’), index=list(‘6521’))

append

df1.append(df2)D	C	B	A	F	E
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
4	2.0	2.0	NaN	NaN	2.0	2.0
3	2.0	2.0	NaN	NaN	2.0	2.0
df1.append(df2, ignore_index=True)D	C	B	A	F	E
0	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
4	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
6	2.0	2.0	NaN	NaN	2.0	2.0
7	2.0	2.0	NaN	NaN	2.0	2.0
df1.append([df2, df3], ignore_index=True)D	C	B	A	F	E
0	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
4	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
6	2.0	2.0	NaN	NaN	2.0	2.0
7	2.0	2.0	NaN	NaN	2.0	2.0
8	NaN	NaN	3.0	3.0	3.0	3.0
9	NaN	NaN	3.0	3.0	3.0	3.0
10	NaN	NaN	3.0	3.0	3.0	3.0
11	NaN	NaN	3.0	3.0	3.0	3.0

merge

創建表格

left = pd.DataFrame({'A': ['a0', 'a1', 'a2', 'a3'],'B': ['b0', 'b1', 'b2', 'b3'],'k1': ['x', 'x', 'y', 'y']})
right = pd.DataFrame({'C': ['c1', 'c2', 'c3', 'c4'],'D': ['d1', 'd2', 'd3', 'd4'],'k1': ['y', 'y', 'z', 'z']})

合并

pd.merge(left,right)A	B	k1	C	D
0	a2	b2	y	c1	d1
1	a2	b2	y	c2	d2
2	a3	b3	y	c1	d1
3	a3	b3	y	c2	d2

只保留所有共同列都相等的行

left['k2'] = list('1234')
right['k2'] = list('5678')
d.merge(left,right)
pd.merge(left,right)
A	B	k1	k2	C	D

on屬性

指定合并基準列

pd.merge(left,right,on='k1')A	B	k1	k2_x	C	D	k2_y
0	a2	b2	y	3		c1	d1	5
1	a2	b2	y	3		c2	d2	6
2	a3	b3	y	4		c1	d1	5
3	a3	b3	y	4		c2	d2	6

how屬性(inner,outer,left , right)

‘inner’:共同列的值必須完全相等:

pd.merge(left, right, on='k1', how='inner')
A	B	k1	k2_x	C	D	k2_y
0	a2	b2	y	3	c1	d1	5
1	a2	b2	y	3	c2	d2	6
2	a3	b3	y	4	c1	d1	5
3	a3	b3	y	4	c2	d2	6

‘outer’:共同列的值都會保留,left或right在共同列上的差集,會對它們的缺失列項的值賦上NaN:

pd.merge(left, right, on='k1', how='outer')A	B	k1	k2_x	C	D	k2_y
0	a0	b0	x	1		NaN	NaN	NaN
1	a1	b1	x	2		NaN	NaN	NaN
2	a2	b2	y	3		c1	d1	5
3	a2	b2	y	3		c2	d2	6
4	a3	b3	y	4		c1	d1	5
5	a3	b3	y	4		c2	d2	6
6	NaN	NaN	z	NaN		c3	d3	7
7	NaN	NaN	z	NaN		c4	d4	8

‘left’:根據左邊的DataFrame確定共同列的保留值,右邊缺失列項的值賦上NaN:

pd.merge(left, right, on='k1', how='left')A	B	k1	k2_x	C	D	k2_y
0	a0	b0	x	1	NaN	NaN	NaN
1	a1	b1	x	2	NaN	NaN	NaN
2	a2	b2	y	3	c1	d1	5
3	a2	b2	y	3	c2	d2	6
4	a3	b3	y	4	c1	d1	5
5	a3	b3	y	4	c2	d2	6

‘right’:根據右邊的DataFrame確定共同列的保留值,左邊缺失列項的值賦上NaN:

pd.merge(left, right, on='k1', how='right')A	B	k1	k2_x	C	D	k2_y
0	a2	b2	y	3		c1	d1	5
1	a3	b3	y	4		c1	d1	5
2	a2	b2	y	3		c2	d2	6
3	a3	b3	y	4		c2	d2	6
4	NaN	NaN	z	NaN		c3	d3	7
5	NaN	NaN	z	NaN		c4	d4	8

indicator

設置True表示顯示合并方式,即left / right / both:

pd.merge(left, right, on='k1', how='outer', indicator=True)
A	B	k1	k2_x	C	D	k2_y	_merge
0	a0	b0	x	1	NaN	NaN	NaN	left_only
1	a1	b1	x	2	NaN	NaN	NaN	left_only
2	a2	b2	y	3	c1	d1	5	both
3	a2	b2	y	3	c2	d2	6	both
4	a3	b3	y	4	c1	d1	5	both
5	a3	b3	y	4	c2	d2	6	both
6	NaN	NaN	z	NaN	c3	d3	7	right_only
7	NaN	NaN	z	NaN	c4	d4	8	right_only

concat

pd.concat([df1, df2])D	C	B	A	F	E
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
4	2.0	2.0	NaN	NaN	2.0	2.0
3	2.0	2.0	NaN	NaN	2.0	2.0

axis

axis=0:豎方向(index)合并,合并方向index作列表相加,非合并方向columns取并集

pd.concat([df1, df2], axis=0)D	C	B	A	F	E
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
4	2.0	2.0	NaN	NaN	2.0	2.0
3	2.0	2.0	NaN	NaN	2.0	2.0

axis=1:橫方向(columns)合并,合并方向columns作列表相加,非合并方向index取并集

pd.concat([df1, df2], axis=1)D	C	B	A	F	E	D	C
4	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
3	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
2	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
6	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0
5	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0

join

inner取交集(inner)

pd.concat([df1, df2], axis=0, join='inner')D	C
4	1.0	1.0
3	1.0	1.0
2	1.0	1.0
1	1.0	1.0
6	2.0	2.0
5	2.0	2.0
4	2.0	2.0
3	2.0	2.0

outer 取并集(outer)

pd.concat([df1, df2], axis=0, join='outer')D	C	B	A	F	E
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
4	2.0	2.0	NaN	NaN	2.0	2.0
3	2.0	2.0	NaN	NaN	2.0	2.0

join_axes 現已刪除

合并后,可以設置非合并方向的行/列名稱,使用某個df的行/列名稱
join_axes=[df1.columns],合并后columns使用df1的

 pd.concat([df1, df2], axis=0, join_axes=[df1.columns])D    C    B    A
4  1.0  1.0  1.0  1.0
3  1.0  1.0  1.0  1.0
2  1.0  1.0  1.0  1.0
1  1.0  1.0  1.0  1.0
6  2.0  2.0  NaN  NaN
5  2.0  2.0  NaN  NaN
4  2.0  2.0  NaN  NaN
3  2.0  2.0  NaN  NaN

axes=[df1.index],合并后index使用df2的:

pd.concat([df1, df2], axis=1, join_axes=[df1.index])D    C    B    A    F    E    D    C
4  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
3  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
2  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN
1  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN

ignore_index

合并方向是否忽略原行/列名稱,而采用系統默認的索引,即從0開始的int。
axis=0時ignore_index=True,index采用系統默認索引:

pd.concat([df1, df2], axis=0, ignore_index=True)D	C	B	A	F	E
0	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
4	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
6	2.0	2.0	NaN	NaN	2.0	2.0
7	2.0	2.0	NaN	NaN	2.0	2.

axis=1時ignore_index=True,columns采用系統默認索引:

pd.concat([df1, df2], axis=1, ignore_index=True)0    1    2    3    4    5    6    7
1  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN
2  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN
3  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
4  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
5  NaN  NaN  NaN  NaN  2.0  2.0  2.0  2.0
6  NaN  NaN  NaN  NaN  2.0  2.0  2.0  2.0

keys

可以加一層標簽,標識行/列名稱屬于原來哪個df。
axis=0時設置keys:

pd.concat([df1, df2],  axis=0, keys=['df1', 'df2'])D	C	B	A	F	E
df1	4	1.0	1.0	1.0	1.0	NaN	NaN3	1.0	1.0	1.0	1.0	NaN	NaN2	1.0	1.0	1.0	1.0	NaN	NaN1	1.0	1.0	1.0	1.0	NaN	NaN
df2	6	2.0	2.0	NaN	NaN	2.0	2.05	2.0	2.0	NaN	NaN	2.0	2.04	2.0	2.0	NaN	NaN	2.0	2.03	2.0	2.0	NaN	NaN	2.0	2.0

axis=1時設置keys:

pd.concat([df1, df2],  axis=1, keys=['df1', 'df2'])df1				df2D	C	B	A	F	E	D	C
4	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
3	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
2	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
6	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0
5	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0 

levels

明確行/列名稱取值范圍:

df = pd.concat([df1, df2], axis=0, keys=['df1', 'df2'], levels=[['df1', 'df2', 'df3', 'df4']])
df.index.levels
FrozenList([['df1', 'df2', 'df3', 'df4'], ['1', '2', '3', '4', '5', '6']])

sort

對列名排序

pd.concat([df1, df2], axis=0, sort=True)A	B	C	D	E	F
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	NaN	NaN	2.0	2.0	2.0	2.0
5	NaN	NaN	2.0	2.0	2.0	2.0
4	NaN	NaN	2.0	2.0	2.0	2.0
3	NaN	NaN	2.0	2.0	2.0	2.0

對行名排序

pd.concat([df1, df2], axis=1, sort=True)D	C	B	A	F	E	D	C
1	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
3	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
4	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
5	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0
6	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0

DataFrame根據行列名稱排序
行名稱排序

aa.sort_index(axis=0)A	B	C	D	E	F
1	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
3	NaN	NaN	2.0	2.0	2.0	2.0
4	1.0	1.0	1.0	1.0	NaN	NaN
4	NaN	NaN	2.0	2.0	2.0	2.0
5	NaN	NaN	2.0	2.0	2.0	2.0
6	NaN	NaN	2.0	2.0	2.0	2.0

列名稱排序

aa.sort_index(axis=1)A	B	C	C	D	D	E	F
1	1.0	1.0	1.0	NaN	1.0	NaN	NaN	NaN
2	1.0	1.0	1.0	NaN	1.0	NaN	NaN	NaN
3	1.0	1.0	1.0	2.0	1.0	2.0	2.0	2.0
4	1.0	1.0	1.0	2.0	1.0	2.0	2.0	2.0
5	NaN	NaN	NaN	2.0	NaN	2.0	2.0	2.0
6	NaN	NaN	NaN	2.0	NaN	2.0	2.0	2.0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449841.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

走技術線,還是技術管理線?

最近因為要給剛畢業的學生做一次演講,所以就職業發展這類話題先以寫博客的形式做一些思考,希望屆時能給同學們帶來質量更高的內容。我在《駕馭你的“職場布朗運動”》一文中談了25條職場感悟并提出了“走技術線,還是技術管理線?”…

[Nikon D80]櫻花盛開的校園

花開花落,陽春三月,隨身背著相機在學校里游走,不斷的尋找視角。知道自己拍的不好,總覺得自己拍的片有各式各樣的缺陷,也許這就是大師與學徒的區別吧。用好手頭的裝備,出好片,鍛煉Visual Effect …

「LG2664 樹上游戲」

題目 這真是一道神仙的一批的題目 定義\(s(i,j)\)表示從點\(i\)到點\(j\)經過的顏色數量 設 \[sum_i\sum_{j1}^ns(i,j)\] 求出所有的\(sum_i\) 考慮點分治 對于一個點我們用兩種方式來統計其答案 這個點作為分治重心時,分值區域內所有點到這個點貢獻這個點不是分治重…

DUBBO 使用問題記錄

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 官方ISSUE參考 https://github.com/alibaba/dubbo/issues 注冊中心ZookeeperRegistry.doSaveProperties warn 2014-10-1419:56:51WARN …

真格量化學習處理——幾個功能小函數

真格這周是學習使用了不少,功能算是很不錯,但在做的時候也發現了一個問題: 數據缺失:我在做回測,要求獲取每天的delta值,并從中篩選條件值時,報錯,顯示無數據。不得不使用pass,影響我的回測連貫性。 現在開始講下,我做的幾個功能函數: 算起來,挺煩的,就是各種細節…

軟件技術發展的驅動力

軟件產品的終極目標是為了實現用戶需求從而滿足人們的需要。也正是為了不斷滿足人們的需要使得軟件行業不斷向前發展。比如,新的算法(MPEG-1、MPEG-2、MPEG-4、H.264、……)等的出現都在當時為了滿足不同的需要而被發明。然而,人們…

The Model Driven Software Network

國外的一個模型驅動軟件開發的討論社區,The Model Driven Software Network這個社區討論的都是模型驅動開發相關的話題,雖然建立不久,但加入的人越來越多,建立群組的是Mark Dalgarno以下是一些討論: Textual v Graphical models W…

無敵簡單快速的文件服務器sgfs

前言 想要構建一個Linux文件服務器?看看下面幾個要求是不是你想要的? 1、只需要單節點部署就夠了 2、部署啟動簡單,下載之后,一鍵啟動,一鍵關閉 3、不需要任何其他的依賴安裝,而且運行時占用內存資源少 4、…

springboot多數據源配置

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 之前在介紹使用JdbcTemplate和Spring-data-jpa時,都使用了單數據源。在單數據源的情況下,Spring Boot的配置非常…

pyhon量化數據處理小細節3---日期格式轉換

不同的數據文檔,會獲得不同日期格式,常見的有str(20200101),datetime(20200101),又或者是2020-01-01,,2020-1-1,20-1-1,20-Apr_20th,2020/01/01,20/01/01等等,總之類型很多。因此需要我們對日期格式進行統一化。這里我…

面向對象和基于對象

面向對象大家都很熟悉,可是基于對象就不一定了。兩個聽起來好象是同一回事,而事實上它們卻千差萬別。基于對象是指:我們采用對象封裝技術,將數據和操作捆綁在一起,但是并沒有合理地使用多態、繼承等面向對象技術進行軟…

CSS margin 屬性簡介

CSS margin 屬性 設置外邊距的最簡單的方法就是使用 margin 屬性。 margin 屬性接受任何長度單位,可以是像素、英寸、毫米或 em。 margin 可以設置為 auto。更常見的做法是為外邊距設置長度值。下面的聲明在 h1 元素的各個邊上設置了 1/4 英寸寬的空白:h…

MVC中使用代碼創建數據庫(code first +mysql+EF)

1.新建一個mvc項目 2.安裝mysql需要的幾個文件 EntityFramework、MySql.Data(6.9.12)和MySql.Data.Entity (6.9.12) 這里有幾點要注意 1.MySql.Data和MySql.Data.Entity 版本必須一致 2.我試用了6.10的版本 要報錯 3.我測試沒有問…

github 學習使用

博主第一次使用github,所以會將過程全成描述歡迎使用Github注冊安裝進入倉庫,創建、修改、上傳文件。強制推送強制覆蓋上傳文件歡迎使用Github 注冊 直接進入github官網:https://github.com 點擊sigh up 進行注冊 直接填寫即可然后驗證通過…

Java中9大內置基本數據類型Class實例和數組的Class實例

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1、Java中9大內置幾本數據類型: 對于對象來說,可以直接使用對象.getClass()或者Class.forName(className);、類名.class都可以…

軟件質量管理之困境與對策思考

相信在不少與軟件開發相關的企業內,質量管理部門與軟件開發部門在日常運作中形成了如下圖所示的“啞鈴形”組織結構。 開發部門執行質量管理部門所制定的流程,通過提供證據的形式將各種流程執行后的數據反饋給質量管理部門(包括缺陷率和各種流…

GDI+用PNG圖片做半透明異型窗口

{*******************************************************}{ }{ GDI用PNG圖片做半透明異型窗口 }{ }{ 版權所有 (C) 2008 QQ:…

java Spring Boot中使用Swagger2構建API文檔

1、添加Swagger2的依賴 在pom.xml中加入Swagger2的依賴 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.2.2</version> </dependency> <dependency><groupId&g…

什么是 FreeMarker

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 轉自官方文檔&#xff0c;只是記錄下官方在線手冊地址&#xff1a;http://freemarker.foofun.cn/ FreeMarker 是一款 模板引擎&#xff…

TP函數

U方法用于完成對URL地址的組裝&#xff0c;特點在于可以自動根據當前的URL模式和設置生成對應的URL地址&#xff0c;格式為&#xff1a;U(地址,參數,偽靜態,是否跳轉,顯示域名);在模板中使用U方法而不是固定寫死URL地址的好處在于&#xff0c;一旦你的環境變化或者參數設置改變…