【Python】感覺是全網(wǎng)最詳細(xì)Pandas合并數(shù)據(jù)集操作總結(jié)
pandas庫來實(shí)現(xiàn)數(shù)據(jù)集之間合并的文章其實(shí)說少也不算少,不過小編總是感覺它們寫的算不上完善,所以今天打算來整理與總結(jié)一下,本文大概的結(jié)構(gòu)是concat()方法的簡單介紹append()方法的簡單介紹merge()方法的簡單介紹join()方法的簡單介紹多重行索引的合并介紹 表格合并之后的列名重命名 combine()方法的簡單介紹combine_first()方法的簡單介紹
Concat()方法的簡單介紹
在我們開始concat()方法的正是介紹之前,我們先來看一下簡單的例子
df1?=?pd.DataFrame(
????{
????????"A":?["A0",?"A1",?"A2",?"A3"],
????????"B":?["B0",?"B1",?"B2",?"B3"],
????????"C":?["C0",?"C1",?"C2",?"C3"],
????????"D":?["D0",?"D1",?"D2",?"D3"],
????},
????index=[0,?1,?2,?3],
)
df2?=?pd.DataFrame(
????{
????????"A":?["A4",?"A5",?"A6",?"A7"],
????????"B":?["B4",?"B5",?"B6",?"B7"],
????????"C":?["C4",?"C5",?"C6",?"C7"],
????????"D":?["D4",?"D5",?"D6",?"D7"],
????},
????index=[4,?5,?6,?7],
)
df3?=?pd.DataFrame(
????{
????????"A":?["A8",?"A9",?"A10",?"A11"],
????????"B":?["B8",?"B9",?"B10",?"B11"],
????????"C":?["C8",?"C9",?"C10",?"C11"],
????????"D":?["D8",?"D9",?"D10",?"D11"],
????},
????index=[8,?9,?10,?11],
)
我們來看一下使用concat()方法之后的效果
frames?=?[df1,?df2,?df3]
result?=?pd.concat(frames)
result
output
??????A????B????C????D
0????A0???B0???C0???D0
1????A1???B1???C1???D1
2????A2???B2???C2???D2
3????A3???B3???C3???D3
4????A4???B4???C4???D4
5????A5???B5???C5???D5
6????A6???B6???C6???D6
7????A7???B7???C7???D7
8????A8???B8???C8???D8
9????A9???B9???C9???D9
10??A10??B10??C10??D10
11??A11??B11??C11??D11
大致合并的方向就是按照軸垂直的方向來進(jìn)行合并,如下圖

下面小編來詳細(xì)介紹一下concat()方法中的各個(gè)參數(shù)作用
pd.concat(
????objs,
????axis=0,
????join="outer",
????ignore_index=False,
????keys=None,
????levels=None,
????names=None,
????verify_integrity=False,
????copy=True,
)
objs:需要用來進(jìn)行合并的數(shù)據(jù)集,可以是Series類型或者是DataFrame類型的數(shù)據(jù) axis:可以理解為是合并的方向,默認(rèn)是0 join:可以理解為是合并的方式,有并集或是交集兩種方式,默認(rèn)的是并集 ignore_index:忽略索引,默認(rèn)是 Falsekeys:用于做行方向的多重索引
大家可能會(huì)有些迷惑,什么是多重的索引呢?看下面的例子
result?=?pd.concat(frames,?keys=["x",?"y",?"z"])
result
output

如此一來,我們可以通過“x”、“y”以及“z”這些元素來獲取每一部分的數(shù)據(jù),例如
result.log["x"]
output
????A???B???C???D
0??A0??B0??C0??D0
1??A1??B1??C1??D1
2??A2??B2??C2??D2
3??A3??B3??C3??D3
除此之外,keys參數(shù)還能夠被用在列索引上
s3?=?pd.Series([0,?1,?2,?3],?name="foo")
s4?=?pd.Series([0,?1,?2,?3])
s5?=?pd.Series([0,?1,?4,?5])
pd.concat([s3,?s4,?s5],?axis=1,?keys=["red",?"blue",?"yellow"])
output
???red??blue??yellow
0????0?????0???????0
1????1?????1???????1
2????2?????2???????4
3????3?????3???????5
列名就變成了keys列表中的元素
而對于join參數(shù),默認(rèn)的是以outer也就是并集的方式在進(jìn)行兩表格的合并
df4?=?pd.DataFrame(
????{
????????"B":?["B2",?"B3",?"B6",?"B7"],
????????"D":?["D2",?"D3",?"D6",?"D7"],
????????"F":?["F2",?"F3",?"F6",?"F7"],
????},
????index=[2,?3,?6,?7],
)
result?=?pd.concat([df1,?df4],?axis=1)
output

而當(dāng)我們將join參數(shù)設(shè)置成inner,也就是交集的方式來進(jìn)行合并,出來的結(jié)果就會(huì)不太一樣
result?=?pd.concat([df1,?df4],?axis=1,?join="inner")
output

接下來我們來看一下ignore_index參數(shù)的作用,它能夠?qū)π兴饕鲆粋€(gè)重新的整合
result?=?pd.concat([df1,?df4],?ignore_index=True,?sort=False)
output

DataFrame格式,另外一個(gè)是Series格式,concat()方法也可以將兩者合并起來,s1?=?pd.Series(["X0",?"X1",?"X2",?"X3"],?name="X")
result?=?pd.concat([df1,?s1],?axis=1)
output

要是在加上ignore_index參數(shù)的話,看一下效果會(huì)如何
result?=?pd.concat([df1,?s1],?axis=1,?ignore_index=True)
output

append()方法的簡單介紹
append()方法是對上面concat()方法的簡單概括,我們來看一下簡單的例子
result?=?df1.append(df2)
result
output

當(dāng)然append()方法當(dāng)中也可以放入多個(gè)DataFrame表格,代碼如下
result?=?df1.append([df2,?df3])
output

和上面的concat()方法相類似的是,append()方法中也有ignore_index參數(shù),
result?=?df1.append(df4,?ignore_index=True,?sort=False)
output

同樣地,我們也可以通過append()方法來給DataFrame表格添加幾行的數(shù)據(jù)
s2?=?pd.Series(["X0",?"X1",?"X2",?"X3"],?index=["A",?"B",?"C",?"D"])
result?=?df1.append(s2,?ignore_index=True)
output

關(guān)于Merge()方法的介紹
在merge()方法中有這些參數(shù)
pd.merge(
????left,
????right,
????how="inner",
????on=None,
????left_on=None,
????right_on=None,
????left_index=False,
????right_index=False,
????sort=True,
????suffixes=("_x",?"_y"),
????copy=True,
????indicator=False,
????validate=None,
)
left/right:也就是所要合并的兩個(gè)表格 on:左右所要合并的兩表格的共同列名 left_on/right_on:兩表格進(jìn)行合并時(shí)所對應(yīng)的字段 how:合并的方式,有l(wèi)eft、right、outer、inner四種,默認(rèn)是inner suffixes:在兩表格進(jìn)行合并時(shí),重復(fù)的列名后面添加的后綴 left_index:若為True,按照左表格的索引來連接兩個(gè)數(shù)據(jù)集 right_index:若為True,按照右表格的索引來連接兩個(gè)數(shù)據(jù)集
我們先來看一個(gè)簡單的例子
left?=?pd.DataFrame(
????{
????????"key":?["K0",?"K1",?"K2",?"K3"],
????????"A":?["A0",?"A1",?"A2",?"A3"],
????????"B":?["B0",?"B1",?"B2",?"B3"],
????}
)
right?=?pd.DataFrame(
????{
????????"key":?["K0",?"K1",?"K2",?"K3"],
????????"C":?["C0",?"C1",?"C2",?"C3"],
????????"D":?["D0",?"D1",?"D2",?"D3"],
????}
)
result?=?pd.merge(left,?right,?on="key")
result
output

merge()的過程當(dāng)中有三種類型的合并,分別是一對一、多對一、多對多。其中“一對一”類型也就是merge()方法會(huì)去尋找兩個(gè)表格當(dāng)中相同的列,例如上面的“key”,并自動(dòng)以這列作為鍵來進(jìn)行排序,需要注意的是共同列中的元素其位置可以是不一致的。df1:
employee????????group??hire_date
0??????Bob???Accounting???????2008
1?????Jake??Engineering???????2002
2?????Mike??Engineering???????2005
3?????Linda??????????HR???????2010
df2:
???????group?supervisor
0???Accounting??????Cathey
1??Engineering??????Dylan
2???????????HR??????James
然后我們來進(jìn)行合并
pd.merge(df_1,?df_2)
output
??employee????????group??hire_date?supervisor
0??????Bob???Accounting???????2008?????Cathey
1?????Jake??Engineering???????2002??????Dylan
2?????Mike??Engineering???????2005??????Dylan
3????Linda???????????HR???????2010??????James
df3:
employee????????group
0??????Bob???Accounting
1?????Jake??Engineering
2?????Lisa??Engineering
3??????Sue???????????HR
df4:?
???????group????????skills
0???Accounting??????????math
1???Accounting??spreadsheets
2??Engineering????????coding
3??Engineering?????????linux
4???????????HR??spreadsheets
5???????????HR??organization
然后我們進(jìn)行合并之后,看一下出來的結(jié)果
df?=?pd.merge(df3,?df4)
print(df)
output
??employee????????group???????skills
0??????Bob???Accounting?????????math
1??????Bob???Accounting??programming
2?????Jake??Engineering????????linux
3?????Jake??Engineering???????python
4?????Lisa??Engineering????????linux
5?????Lisa??Engineering???????python
6??????Sue???????????HR?????????java
7??????Sue???????????HR??????????c++
how有四種合并的方式,有“l(fā)eft”、“right”、“inner”、“outer”,分別代表inner:也就是交集,在使用 merge()方法的時(shí)候,默認(rèn)采用的都是交集的合并方式outer:可以理解為是并集的合并方式 left/right: 單方向的進(jìn)行并集的合并
我們先來看一下“l(fā)eft”方向的并集的合并
result?=?pd.merge(left,?right,?how="left",?on=["key1",?"key2"])
result
output

我們再來看一下“right”方向的并集的合并
result?=?pd.merge(left,?right,?how="right",?on=["key1",?"key2"])
result
output

“outer”方式的合并
result?=?pd.merge(left,?right,?how="outer",?on=["key1",?"key2"])
result
output

“inner”方式的合并
result?=?pd.merge(left,?right,?how="inner",?on=["key1",?"key2"])
result
output

關(guān)于join()方法的簡單介紹
join()方法用于將兩個(gè)有著不同列索引的表格合并到一起,我們先來看一個(gè)簡單的例子
left?=?pd.DataFrame(
????{"A":?["A0",?"A1",?"A2"],?"B":?["B0",?"B1",?"B2"]},?index=["K0",?"K1",?"K2"]
)
right?=?pd.DataFrame(
????{"C":?["C0",?"C2",?"C3"],?"D":?["D0",?"D2",?"D3"]},?index=["K0",?"K2",?"K3"]
)
result?=?left.join(right)
output

在join()方法中也有參數(shù)how用來定義合并的方式,和merge()方法相類似,這里便也有不做贅述
當(dāng)多重行索引遇到join()方法
當(dāng)遇到一表格,其中的行索引是多重行索引的時(shí)候,例如
left?=?pd.DataFrame(
????{"A":?["A0",?"A1",?"A2"],?"B":?["B0",?"B1",?"B2"]},
????index=pd.Index(["K0",?"K1",?"K2"],?name="key"),
)
index?=?pd.MultiIndex.from_tuples(
????[("K0",?"Y0"),?("K1",?"Y1"),?("K2",?"Y2"),?("K2",?"Y3")],
????names=["key",?"Y"],
)
right?=?pd.DataFrame(
????{"C":?["C0",?"C1",?"C2",?"C3"],?"D":?["D0",?"D1",?"D2",?"D3"]},
????index=index,
)
result?=?left.join(right,?how="inner")
output

那么要是要合并的兩張表格都是多重行索引呢?
leftindex?=?pd.MultiIndex.from_product(
????[list("abc"),?list("xy"),?[1,?2]],?names=["abc",?"xy",?"num"]
)
left?=?pd.DataFrame({"v1":?range(12)},?index=leftindex)
output
????????????v1
abc?xy?num????
a???x??1?????0
???????2?????1
????y??1?????2
???????2?????3
b???x??1?????4
???????2?????5
????y??1?????6
???????2?????7
c???x??1?????8
???????2?????9
????y??1????10
???????2????11
第二張表格如下
rightindex?=?pd.MultiIndex.from_product(
????[list("abc"),?list("xy")],?names=["abc",?"xy"]
)
right?=?pd.DataFrame({"v2":?[100?*?i?for?i?in?range(1,?7)]},?index=rightindex)
output
?????????v2
abc?xy?????
a???x???100
????y???200
b???x???300
????y???400
c???x???500
????y???600
將上述的兩張表格進(jìn)行合并
left.join(right,?on=["abc",?"xy"],?how="inner")
output
????????????v1???v2
abc?xy?num?????????
a???x??1?????0??100
???????2?????1??100
????y??1?????2??200
???????2?????3??200
b???x??1?????4??300
???????2?????5??300
????y??1?????6??400
???????2?????7??400
c???x??1?????8??500
???????2?????9??500
????y??1????10??600
???????2????11??600
列名的重命名
要是兩張表格的列名相同,合并之后會(huì)對其列名進(jìn)行重新命名,例如
left?=?pd.DataFrame({"k":?["K0",?"K1",?"K2"],?"v":?[1,?2,?3]})
right?=?pd.DataFrame({"k":?["K0",?"K0",?"K3"],?"v":?[4,?5,?6]})
result?=?pd.merge(left,?right,?on="k")
output

這里就不得不提到suffixes這個(gè)參數(shù),通過這個(gè)參數(shù)來個(gè)列進(jìn)行重命名,例如
result?=?pd.merge(left,?right,?on="k",?suffixes=("_l",?"_r"))
output

combine_first()方法的簡單介紹
要是要合并的兩表格,其中一個(gè)存在空值的情況,就可以使用combine_first()方法,
df1?=?pd.DataFrame({'A':?[None,?0],?'B':?[None,?4]})
df2?=?pd.DataFrame({'A':?[1,?1],?'B':?[3,?3]})
df1.combine_first(df2)
output
?????A????B
0??1.0??3.0
1??0.0??4.0
表格當(dāng)中的空值就會(huì)被另外一張表格的非空值給替換掉
combine()方法的簡單介紹
combine()方法是將兩表格按照列的方向進(jìn)行合并,但是不同在于還需要另外傳進(jìn)去一個(gè)第三方的函數(shù)或者是方法,來看一個(gè)簡單的例子df1?=?pd.DataFrame({'A':?[0,?0],?'B':?[4,?4]})
df2?=?pd.DataFrame({'A':?[1,?1],?'B':?[3,?3]})
take_smaller?=?lambda?s1,?s2:?s1?if?s1.sum()?else?s2
我們定義了一個(gè)簡單的方法,在合并的過程中提取出總和較小的值
df1.combine(df2,?take_smaller)
output
???A??B
0??0??3
1??0??3
要是表格中存在空值,combine()方法也有fill_value這個(gè)參數(shù)來處理
df1?=?pd.DataFrame({'A':?[0,?0],?'B':?[None,?4]})
df2?=?pd.DataFrame({'A':?[2,?2],?'B':?[3?3]})
df1.combine(df2,?take_smaller,?fill_value=-5)
output
???A????B
0??0?-5.0
1??0??4.0
往期精彩回顧 本站qq群554839127,加入微信群請掃碼:
