「python」DataFrame數據合併

使用python讀取數據,進行所謂表的合併是非常常見的。但是我在這裏不是介紹如何合併不同類型的表格

介紹兩個函數:pandas.merge和pandas.concat

1. merge

 merge可以翻譯成是融合的意思,使用的時候注意參數的設置。

函數的參數:

merge(
    left,
    right,
    how="inner",
    on=None,
    left_on=None,
    right_on=None,
    left_index=False,
    right_index=False,
    sort=False,
    suffixes=("_x", "_y"),
    copy=True,
    indicator=False,
    validate=None,
)

參數詳解:

對於inner、left、right、outer的解釋:

參考:https://blog.csdn.net/trayvontang/article/details/103787648

 

常見報錯信息:

就是合併之後爲空

a=pd.DataFrame({'a':[1,2,3],'b':[2,3,4]})
b=pd.DataFrame({'a':[11,22,33],'c':[22,33,44]})
c=pd.merge(a,b)
print(c)

輸出結果爲:

Empty DataFrame
Columns: [a, b, c]
Index: []

通過驗證發現,a和b的同名列表被合併,但是都是空說明默認連接形式是內連接,及二者默認把相同列名作爲查找的條件,若是查找不到相同的值返回空。

因此需要加入連接條件

c=pd.merge(a,b,how='outer',on='a')
print(c)

輸出結果爲:

    a    b     c
0   1  2.0   NaN
1   2  3.0   NaN
2   3  4.0   NaN
3  11  NaN  22.0
4  22  NaN  33.0
5  33  NaN  44.0

 

參考:https://blog.csdn.net/youyoujbd/article/details/88930961

 

2. concat

該函數可以翻譯成:連接(就是兩個表格的直接相連)

和mrege不同的是cancat是真正的"連接‘’,它把a,b兩個表完全拼接在一起,默認拼接形式是並集,我們可以通過修改參數來修改拼接模式,以及拼接方向,也可以重述索引。

a=pd.DataFrame({'a':[1,2,3],'b':[2,3,4]})
b=pd.DataFrame({'a':[11,22,33],'c':[22,33,44]})
pd.concat([a,b],axis=1)
   a  b   a   c
0  1  2  11  22
1  2  3  22  33
2  3  4  33  44
a=pd.DataFrame({'a':[1,2,3],'b':[2,3,4]})
b=pd.DataFrame({'a':[11,22,33],'c':[22,33,44]})
pd.concat([a,b],join='inner')
  a
0   1
1   2
2   3
0  11
1  22
2  33
a=pd.DataFrame({'a':[1,2,3],'b':[2,3,4]})
b=pd.DataFrame({'a':[1,2,3],'b':[22,33,44]})
pd.concat([a,b])
a   b
1   2
2   3
3   4
1  22
2  33
3  44
NB:數據不會被覆蓋,而是直接連接到下面
d=pd.concat([a,b])
d.index=list(range(0,6))
print(d)
   a    b     c
0   1  2.0   NaN
1   2  3.0   NaN
2   3  4.0   NaN
3  11  NaN  22.0
4  22  NaN  33.0
5  33  NaN  44.0

常見的一個報錯信息:

TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"

出錯原因就是,在使用pandas.concat(a,b)進行合併的時候,需要是list的形式。因此改成pandas.concat([a,b]),就可以成功合併。

例子:

a = pd.DataFrame()
b = pd.DataFrame()
c = pd.concat(a,b) # errors out:
TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"

c = pd.concat([a,b]) # works.

 

參考:https://stackoverflow.com/questions/39534676/typeerror-first-argument-must-be-an-iterable-of-pandas-objects-you-passed-an-o

 

3. join函數

DataFrame自身具有一個函數join,可以實現一定的連接功能。

 函數參數:

df.join(other, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False)

例:1:

df3=pd.DataFrame({'Red':[1,3,5],'Green':[5,0,3]},index=list('abd'))
print(df3)
df4=pd.DataFrame({'Blue':[1,9],'Yellow':[6,6]},index=list('ce'))
print(df4)
df3.join(df4)

輸出結果:默認是left連接

 

例2:使用參考how=“outer”

df3.join(df4,how='outer')

輸出結果:

 

例3:合併多個對象

df3=pd.DataFrame({'Red':[1,3,5],'Green':[5,0,3]},index=list('abd'))
print(df3)
df4=pd.DataFrame({'Blue':[1,9],'Yellow':[6,6]},index=list('ce'))
print(df4)
df5=pd.DataFrame({'Brown':[3,4,5],'White':[1,1,2]},index=list('aed'))
print(df3.join([df4,df5]))

輸出結果:

 

df3=pd.DataFrame({'Red':[1,3,5],'Green':[5,0,3]},index=list('abd'))
print(df3)
df4=pd.DataFrame({'Blue':[1,9],'Yellow':[6,6]},index=list('ce'))
print(df4)
df5=pd.DataFrame({'Brown':[3,4,5],'White':[1,1,2]},index=list('aed'))
print(df5)
print(df3.join([df4,df5],how='outer'))

輸出結果:

 

 

參考:https://blog.csdn.net/weixin_38168620/article/details/80659154

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章