Pandas高階 合併資料集concat

2021-09-10 03:32:44 字數 4687 閱讀 8254

本文主要介紹pandas中常用的資料合併的方法concat。

先定義乙個生產資料的函式:

"""乙個簡單的dataframe"""

def make_df(cols, ind):

data =

return pd.dataframe(data, ind)

看下函式效果:

in:

make_df('ab', [1, 2])

out:

a b1 a1 b1

2 a2 b2

pd.concat()可以簡單地合併一維或多維的 series 或 dataframe 物件。

in:

df1 = make_df('ab', [1, 2])

df2 = make_df('ab', [3, 4])

print(df1); print(df2);

print(pd.concat([df1, df2]))

out:

a b

1 a1 b1

2 a2 b2

a b

3 a3 b3

4 a4 b4

a b

1 a1 b1

2 a2 b2

3 a3 b3

4 a4 b4

預設情況下,dataframe 的合併都是逐行進行的(預設設定是 axis=0)。pd.concat 也可以通過設定合併座標軸axis='col'axis=1來實現按列合併。例如下面的示例:

in:

df3 = make_df('ab', [0, 1])

df4 = make_df('cd', [0, 1])

print(df3); print(df4);

print(pd.concat([df3, df4], axis=1))

out:

a b

0 a0 b0

1 a1 b1

c d

0 c0 d0

1 c1 d1

a b c d

0 a0 b0 c0 d0

1 a1 b1 c1 d1

很多時候,將資料合併時,會出現重複索引的問題,如下:

in:

x = make_df('ab', [0, 1])

y = make_df('ab', [2, 3])

y.index = x.index # 複製索引

print(x); print(y);

print(pd.concat([x, y]))

out:

a b

0 a0 b0

1 a1 b1

a b

0 a2 b2

1 a3 b3

a b

0 a0 b0

1 a1 b1

0 a2 b2

1 a3 b3

針對這個問題,有兩種處理方法:

1.忽略索引。有時索引無關緊要,那麼合併時就可以忽略它們,可以通過設定ignore_index引數來實現。如果將引數設定為true,那麼合併時將會建立乙個新的整數索引。

in:

x = make_df('ab', [0, 1])

y = make_df('ab', [2, 3])

y.index = x.index # 複製索引

print(x); print(y); print(pd.concat([x, y],ignore_index=true))

out:

a b

0 a0 b0

1 a1 b1

a b

0 a2 b2

1 a3 b3

a b

0 a0 b0

1 a1 b1

2 a2 b2

3 a3 b3

(2) 增加多級索引。另一種處理索引重複的方法是通過keys引數為資料來源設定多級索引標籤,這樣結果資料就會帶上多級索引以便區分,如下:

in:

x = make_df('ab', [0, 1])

y = make_df('ab', [2, 3])

y.index = x.index # 複製索引

print(x); print(y); print(pd.concat([x, y],keys=['x','y']))

out:

a b

0 a0 b0

1 a1 b1

a b

0 a2 b2

1 a3 b3

a b

x 0 a0 b0

1 a1 b1

y 0 a2 b2

1 a3 b3

使用concat方法合併資料集時有個弊端:如果按預設的逐行合併,那麼兩個資料集的列名需要一致。如果按列合併資料集,那麼兩個資料集的行數需要一致。否則就會出現如下nan的情況。

in:

df1 = make_df('ab', [1, 2])

df2 = make_df('cd', [3, 4])

print(df1); print(df2); print(pd.concat([df1, df2]))

out:

a b

1 a1 b1

2 a2 b2

c d

3 c3 d3

4 c4 d4

a b c d

1 a1 b1 nan nan

2 a2 b2 nan nan

3 nan nan c3 d3

4 nan nan c4 d4

in:

df3 = make_df('ab', [0, 1])

df4 = make_df('cde', [0, 1,2])

print(df3); print(df4); print(pd.concat([df3, df4], axis=1))

out:

a b

0 a0 b0

1 a1 b1

c d e

0 c0 d0 e0

1 c1 d1 e1

2 c2 d2 e2

a b c d e

0 a0 b0 c0 d0 e0

1 a1 b1 c1 d1 e1

2 nan nan c2 d2 e2

針對這個問題,可以用joinjoin_ axes引數設定合併方式。預設的合併方式是對所有輸入列進行並集合並(join='outer'), 當然也可以用join='inner'實現對輸入列的交集合併:

in:

df5 = make_df('abc', [1, 2])

df6 = make_df('bcd', [3, 4])

print(df5); print(df6);

print(pd.concat([df5, df6], join='inner'))

out:

a b c

1 a1 b1 c1

2 a2 b2 c2

b c d

3 b3 c3 d3

4 b4 c4 d4

b c

1 b1 c1

2 b2 c2

3 b3 c3

4 b4 c4

另一種合併方式是直接確定結果使用的列名,設定join_axes引數,裡面是索引物件構成 的列表(是列表的列表)。如下面示例所示,將結果的列名設定為第乙個輸入的列名:

in:

df5 = make_df('abc', [1, 2])

df6 = make_df('bcd', [3, 4])

print(df5); print(df6);

print(pd.concat([df5, df6], join_axes=[df5.columns]))

out:

a b c

1 a1 b1 c1

2 a2 b2 c2

b c d

3 b3 c3 d3

4 b4 c4 d4

a b c

1 a1 b1 c1

2 a2 b2 c2

3 nan b3 c3

4 nan b4 c4

關於concat方法就介紹這麼多。

本文摘自《python資料科學手冊》

Pandas 合併資料集

在資料探勘過程中,經常會有不同 的資料需要進行合併操作。今天介紹通過python下的pandas庫下的merge方法和concat方法來實現資料集的合併。merge 函式通過乙個或多個鍵來將資料集的行連線起來。該函式的主要 應用場景是針對同乙個主鍵存在兩張包含不同特徵的表,通過該主鍵的連線,將兩張表...

Pandas 按索引合併資料集

import numpy as np import pandas as pd from pandas import series,dataframeleft1 dataframe set index 水果 right1 dataframe print left1 print right1 數量 水果...

pandas合併資料集(merge使用)

merge 合併資料集,通過left,right確定連線字段,預設是兩個資料集相同的字段 引數 說明 left 參與合併的左側dataframe right 參與合併的右側dataframe how 連線方式 inner 預設 還有,outer left right on 用於連線的列名,必須同時存...