pandas的數(shù)據(jù)合并與重塑有很多種方法拖云,包括直接復(fù)制列,concat,append咖为,merge和join我衬,本文將重點(diǎn)討論前面三種最簡(jiǎn)單而又最常用的方法。merge和join有空再更哈?。
一. 直接復(fù)制列
可以將新的數(shù)據(jù)列利用 [] 直接賦值給原始數(shù)據(jù)难礼,但是要求新的列名不能和原始數(shù)據(jù)中的列名重名景醇,否則會(huì)覆蓋原始數(shù)據(jù)中的列获搏。
具體來(lái)看:
可以看到新的數(shù)據(jù)塊被直接貼在了原數(shù)據(jù)列的后面,是不是很簡(jiǎn)單,嗯但是這個(gè)方法有很多局限性,比如:
- 只能按列合并,不能按行合并操作刀荒。
- 只能給原數(shù)據(jù)中存在的index添加新列姨拥,不會(huì)給原數(shù)據(jù)添加新行(index)。這種合并方法是以原始數(shù)據(jù)index為基準(zhǔn)的详炬,也就是說(shuō)盐类,新老數(shù)據(jù)的交集行會(huì)被直接保留,老數(shù)據(jù)有的而新數(shù)據(jù)沒(méi)有的索引行將會(huì)補(bǔ)nan值呛谜,新數(shù)據(jù)有的而老數(shù)據(jù)沒(méi)有的索引行在跳,將會(huì)被舍棄∩肼剩可以看到硬毕,例子中index=3的行就被舍棄了,而index=0的行被設(shè)為了nan礼仗。
二. append
前面已經(jīng)有了合并列的方法吐咳,那么pandas不會(huì)這么坑爹逻悠,不能合并行吧!韭脊!當(dāng)然不會(huì)童谒,append就是干這個(gè)事情的,它專(zhuān)門(mén)用來(lái)在表尾添加新行...
熟悉Python的大佬們看到append這個(gè)詞就應(yīng)該有感覺(jué)了,沒(méi)錯(cuò)沪羔,它就是添加新元素的方法饥伊。Seris,DataFrame蔫饰,Index都有這個(gè)方法琅豆,我們可以利用這個(gè)添加新元素的方法,來(lái)對(duì)數(shù)據(jù)進(jìn)行縱向合并篓吁。
官方文檔中是這樣描述append的用途的“在表尾中添加新行茫因,并且返回添加后的數(shù)據(jù)對(duì)象,如果添加的行中存在原數(shù)據(jù)中沒(méi)有的列杖剪,那么將給原數(shù)據(jù)添加一個(gè)新列冻押,并用nan補(bǔ)值∈⒑伲”
DataFrame.append(*other*, *ignore_index=False*, *verify_integrity=False*, *sort=None*)
- other: 是要添加的數(shù)據(jù)洛巢,append很不挑食,這個(gè)other可以是dataframe次兆,dict稿茉,Seris,list等等类垦。
- ignore_index: 參數(shù)為T(mén)rue時(shí)將在數(shù)據(jù)合并后狈邑,按照0,1蚤认,2米苹,3....的順序重新設(shè)置索引,忽略了舊索引砰琢。
- verify_integrity:參數(shù)為T(mén)rue時(shí)蘸嘶,如果合并的數(shù)據(jù)與原數(shù)據(jù)包含索引相同的行,將報(bào)錯(cuò)陪汽。
我們來(lái)看個(gè)栗子:
三. concat
concat函數(shù)是在pandas命名空間下的方法训唱,所以通過(guò)pd.concat()的方式來(lái)引用,它可以將數(shù)據(jù)根據(jù)不同的軸作做融合挚冤。concat 與其說(shuō)是連接况增,更準(zhǔn)確的說(shuō)是拼接。就是把兩個(gè)表直接合在一起训挡。于是有一個(gè)突出的問(wèn)題澳骤,是橫向拼接還是縱向拼接歧强。
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
常用參數(shù):
obj:要合并的series,dataframe或者是panel構(gòu)成的序列为肮,常將這些數(shù)據(jù)排成一個(gè)列表[data1,data2....]摊册。
axis:按照哪個(gè)方向拼接,0是縱向拼接(默認(rèn))颊艳,1是橫向拼接茅特。
join:設(shè)置合并取交集(inner)還是并集(outer)∑逭恚縱向拼接時(shí)取column的交并集白修,橫向拼接時(shí)取index的交并集。
join_axes:index的列表重斑,僅在橫向合并時(shí)使用熬荆,指明要將數(shù)據(jù)合并入哪個(gè)原表的index。
ignore_index:如果設(shè)置為true绸狐,則無(wú)視表的index,直接合并累盗,合并后生成新的index寒矿。
keys:表標(biāo)識(shí)的列表,用來(lái)區(qū)分合并的表來(lái)自哪里若债。
1. 縱向合并
縱向合并axis=0符相,是將表在豎直方向拼接起來(lái),此時(shí)join參數(shù)控制的是column的交集或者并集蠢琳,使用join_axes會(huì)報(bào)錯(cuò)啊终。舉個(gè)栗子....
我們看到j(luò)oin參數(shù)控制著column的交并集。如果取并集傲须,不存在的位置會(huì)被補(bǔ)充上nan蓝牲。
另外,如果我們?cè)O(shè)置了ignore_index=True的話(huà)泰讽,數(shù)據(jù)合并后將會(huì)重新按照0例衍,1,2已卸,3.......的順序重新構(gòu)建索引佛玄。
2. 橫向合并
橫向合并axis=1,是將表在水平方向拼接起來(lái)累澡,此時(shí)join參數(shù)控制的是index的交集或者并集梦抢。
橫向合并時(shí),即便是列名相同愧哟,也不會(huì)合并成一列奥吩,因?yàn)榇藭r(shí)join控制的是index的交并集哼蛆。而ignore_index將會(huì)重排列名的索引,而不是重排index圈驼。
再來(lái)個(gè)index并集的栗子.....
-
join_axes參數(shù)
如果有join_axes的參數(shù)傳入人芽,可以指定根據(jù)哪個(gè)index來(lái)對(duì)齊數(shù)據(jù) 。例如根據(jù)df1表對(duì)齊數(shù)據(jù)绩脆,就會(huì)保留指定的df1表的index萤厅,然后將df4的表與之拼接,僅axis=1時(shí)有效靴迫。是不是有種熟悉的感覺(jué)惕味,嗯對(duì),和直接復(fù)制列一樣.....
result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])