03-pandas-Ⅱ

一.pandas層次化索引

1.1 創(chuàng)建多層索引
1.1.1 隱式構(gòu)造
最常見的方法是給DataFrame構(gòu)造函數(shù)的index參數(shù)傳遞兩個(gè)或更多的數(shù)組

columns = [['期中', '期中','期中','期末','期末','期末'],['語文','數(shù)學(xué)','英語','語文','數(shù)學(xué)','英語']]
data = np.random.randint(0,150,size=(10,6))
# index = [['一班', 1],['一班', 1],['一班', 1],['一班', 1],['一班', 1],['二班', 1],['二班', 1],['二班', 1],['二班', 1],['二班', 1]]
index = [['一班','一班','一班','一班','一班','二班','二班','二班','二班','二班'], np.arange(10)]
df = DataFrame(data=data,columns=columns, index=index)
df
輸出:
                期中        期末
        語文 數(shù)學(xué)  英語 語文  數(shù)學(xué)  英語
一班    0 83  23 23  41   85  16
        1 82 143 63 69 51 12
        2 142 21 4 19 52 124
        3 63    99 89 106 30 8
        4 142 126 51 111 42 83
二班    5 89 47   139 131 133 115
        6  76 34 30 67  15 38
        7   116 93  81  45  74  76
        8   83  21  64  83  40  1
        9   99  79  83  48  42  68

Series也可以創(chuàng)建多層索引

index = [['一班','一班','一班','一班','一班','二班','二班','二班','二班','二班'], np.arange(10)]
s = Series(data=np.random.randint(150,size=10),index=index)
s

輸出:
一班  0    127
    1    129
    2     15
    3    148
    4    112
二班  5     91
    6     59
    7     80
    8    130
    9    140
dtype: int32
1.1.2 顯式構(gòu)造MultiIndex
  1. 使用數(shù)組
columns = pd.MultiIndex.from_arrays([['期中', '期中','期中','期末','期末','期末'],['語文','數(shù)學(xué)','英語','語文','數(shù)學(xué)','英語']])
data = np.random.randint(0,150,size=(10,6))
# index = [['一班', 1],['一班', 1],['一班', 1],['一班', 1],['一班', 1],['二班', 1],['二班', 1],['二班', 1],['二班', 1],['二班', 1]]
index = pd.MultiIndex.from_arrays([['一班','一班','一班','一班','一班','二班','二班','二班','二班','二班'], np.arange(10)])
df = DataFrame(data=data,columns=columns, index=index)
df

輸出:

                          期中    期末
          語文  數(shù)學(xué)  英語  語文  數(shù)學(xué)    英語
一班     0    119 8   81  109 117 30
        1   5   35  149 47  114 31
        2   128 60  148 55  96  101
        3   65  92  94  147 145 72
        4   48  108 74  50  48  86
二班  5   81  85  93  92  57  10
        6   52  67  83  76  104 59
        7   125 23  57  103 27  22
        8   7   39  79  114 12  90
        9   30  140 20  71  0   42
  1. 使用tuple
columns = [['期中', '期中','期中','期末','期末','期末'],['語文','數(shù)學(xué)','英語','語文','數(shù)學(xué)','英語']]
data = np.random.randint(0,150,size=(10,6))
# index = [['一班', 1],['一班', 1],['一班', 1],['一班', 1],['一班', 1],['二班', 1],['二班', 1],['二班', 1],['二班', 1],['二班', 1]]
# index = pd.MultiIndex.from_arrays([['一班','一班','一班','一班','一班','二班','二班','二班','二班','二班'], np.arange(10)])
index = pd.MultiIndex.from_tuples([('一班', 1),('一班', 2),('一班', 3),('一班', 4),('一班', 5),('二班', 6),('二班', 7),('二班', 8),('二班', 9),('二班', 10)])
df = DataFrame(data=data,columns=columns, index=index)
df

輸出:
              期中       期末
         語文 數(shù)學(xué) 英語 語文 數(shù)學(xué) 英語
一班    1 147 10  49  41  120 45
        2   35  134 120 125 90  31
        3   133 93  80  49  56  68
        4   65  137 147 1   134 33
        5   2   5   111 16  51  108
二班    6 89  90  81  90  66  79
        7   87  125 124 88  32  49
        8   120 15  124 47  46  6
        9   45  12  35  103 108 87
      10    95  21  92  14  72  46
  1. 使用product(最簡單,推薦使用)
columns = pd.MultiIndex.from_product([['期中','期末'],['語文','數(shù)學(xué)','英語']])
data = np.random.randint(0,150,size=(10,6))
# index = [['一班', 1],['一班', 1],['一班', 1],['一班', 1],['一班', 1],['二班', 1],['二班', 1],['二班', 1],['二班', 1],['二班', 1]]
# index = pd.MultiIndex.from_arrays([['一班','一班','一班','一班','一班','二班','二班','二班','二班','二班'], np.arange(10)])
index = pd.MultiIndex.from_product([['一班','二班'],np.arange(5)])
df = DataFrame(data=data,columns=columns, index=index)
df

輸出:
               期中       期末
         語文 數(shù)學(xué) 英語 語文 數(shù)學(xué) 英語
一班  0   92  46  64  56  130 38
        1   62  137 48  107 2   111
        2   96  0   117 2   83  16
        3   109 21  28  135 67  111
        4   86  123 118 0   108 105
二班  0   52  118 38  140 119 82
        1   101 75  75  69  43  87
        2   61  25  65  68  106 63
        3   63  83  106 81  34  113
        4   25  97  53  118 35  137
1.2 多層列索引

除了行索引index,列索引columns也能用同樣的方法創(chuàng)建多層索引

a = np.random.randint(0,150,(2,8))
Mindex = pd.MultiIndex.from_product([['語文','數(shù)學(xué)','英語','理綜'],['期中','期末']])
ddd = DataFrame(data = a,
                index = ['張三','李四'],
                columns = Mindex)
ddd

輸出:
      語文    數(shù)學(xué)  英語  理綜
      期中    期末  期中  期末  期中  期末  期中  期末
張三  57  110 65  3   127 66  146 32
李四  73  24  57  19  35  133 57  127
1.3 多層索引對象的索引與切片操作
1.3.1 Series的操作

【重要】對于Series來說,直接中括號[]與使用.loc()完全一樣,推薦使用.loc中括號索引和切片。

  1. 索引
s
一班  0    127
    1    129
    2     15
    3    148
    4    112
二班  5     91
    6     59
    7     80
    8    130
    9    140
dtype: int32

s['一班']
輸出:
0    127
1    129
2     15
3    148
4    112
dtype: int32

s.loc['一班']
輸出:
0    127
1    129
2     15
3    148
4    112
dtype: int32
  1. 切片
s[2:6]
輸出:
一班  2     15
    3    148
    4    112
二班  5     91
1.3.2 DataFrame的操作
  1. 可以直接使用列名稱來進(jìn)行列索引
df
輸出:
                期中           期末
        語文  數(shù)學(xué)  英語  語文  數(shù)學(xué)  英語
一班  張三  133 82  139 86  83  112
        李四  129 85  23  131 4   18
        王五  9   15  96  131 72  77
二班  張三  4   142 104 48  81  108
        李四  75  60  108 126 85  122
        王五  24  31  53  72  49  

行多級索引的索引和切片操作

# DataFrame中操作行要調(diào)用loc[]
df.loc['一班'].loc[['李四']]
輸出:
                  期中    期末
      語文    數(shù)學(xué)  英語  語文  數(shù)學(xué)  英語
李四  129 85  23  131 4   18

df.loc['一班': '二班']
輸出:
              期中    期末
        語文  數(shù)學(xué)  英語  語文  數(shù)學(xué)  英語
一班  張三  133 82  139 86  83  112
        李四  129 85  23  131 4   18
        王五  9   15  96  131 72  77
二班  張三  4   142 104 48  81  108
        李四  75  60  108 126 85  122
        王五  24  31  53  72  49  46

# 和Series一樣,直接切內(nèi)層索引,會沒有結(jié)果.不會報(bào)錯.
df.loc['張三': '李四']
輸出:
          期中    期末
語文  數(shù)學(xué)  英語  語文  數(shù)學(xué)  英語

# 隱式索引不涉及外層索引
df.iloc[[0]]
輸出:
              期中    期末
        語文  數(shù)學(xué)  英語  語文  數(shù)學(xué)  英語
一班  張三  133 82  139 86  83  112

列多級索引的索引和切片操作

df['期中'][['語文', '數(shù)學(xué)']]
輸出:
            語文 數(shù)學(xué)
一班  張三  133 82
      李四    129 85
      王五    9   15
 二班 張三  4   142
      李四    75  60
      王五    24  31

# 列索引,直接切片,沒有報(bào)錯,但是沒有結(jié)果.
df['期中': '期末']
輸出:
         期中         期末
語文  數(shù)學(xué)  英語  語文  數(shù)學(xué)  英語
  1. 使用行索引需要用loc()函數(shù)

【極其重要】推薦使用loc()函數(shù)

注意在對行索引的時(shí)候,若一級行索引還有多個(gè),對二級行索引會遇到問題!也就是說,無法直接對二級索引進(jìn)行索引,必須讓二級索引變成一級索引后才能對其進(jìn)行索引!

df.loc['一班', '張三'].loc['期中', '語文'] = 88
輸出:
                        期中  期末
              語文    數(shù)學(xué)  英語  語文  數(shù)學(xué)  英語
一班  張三  88.0    82.0    88.0    86.0    83.0    112.0
        李四  129.0   85.0    23.0    131.0   4.0 18.0
        王五  9.0 15.0    96.0    131.0   72.0    77.0
二班  張三  4.0 142.0   104.0   48.0    81.0    108.0
        李四  75.0    60.0    108.0   126.0   85.0    122.0
        王五  24.0    31.0    53.0    72.0    49.0    46.0
1.4 索引的堆

stack()
unstack()

# stack就是把列索引,變成最內(nèi)層的行索引.從水平變成垂直.
【小技巧】使用stack()的時(shí)候,level等于哪一個(gè),哪一個(gè)就消失,出現(xiàn)在行里。
# unstack把最內(nèi)層的行索引變成列索引.
【小技巧】使用unstack()的時(shí)候,level等于哪一個(gè),哪一個(gè)就消失,出現(xiàn)在列里。
df.stack()
1.5 聚合操作

【注意】

  • 需要指定axis

  • 【小技巧】和unstack()相反,聚合的時(shí)候,axis等于哪一個(gè),哪一個(gè)就保留。

# 聚合操作的時(shí)候,默認(rèn)算的是列的聚合.
df.sum()
輸出:
期中  語文    329.0
    數(shù)學(xué)    415.0
    英語    472.0
期末  語文    594.0
    數(shù)學(xué)    374.0
    英語    483.0
dtype: float64

# 聚合操作的時(shí)候.axis=0表示列,=1表示行
df.sum(axis=0)
輸出:
期中  語文    329.0
    數(shù)學(xué)    415.0
    英語    472.0
期末  語文    594.0
    數(shù)學(xué)    374.0
    英語    483.0
dtype: float64

# 聚合操作的時(shí)候,level等于哪一層,就保留哪一層.
df.sum(level=1)
輸出:
                  期中    期末
      語文    數(shù)學(xué)  英語  語文  數(shù)學(xué)  英語
張三  92.0    224.0   192.0   134.0   164.0   220.0
李四  204.0   145.0   131.0   257.0   89.0    140.0
王五  33.0    46.0    149.0   203.0   121.0   123.0

所謂的聚合操作:平均數(shù),方差,最大值,最小值……

df.mean(level=1, axis=1)
輸出:
            語文  數(shù)學(xué)  英語
一班  張三  87.0    82.5    100.0
      李四    130.0   44.5    20.5
      王五    70.0    43.5    86.5
二班  張三  26.0    111.5   106.0
      李四    100.5   72.5    115.0
      王五    48.0    40.0    49.5

df.max(level=1, axis=1)
輸出:
              語文    數(shù)學(xué)  英語
一班  張三  88.0    83.0    112.0
        李四  131.0   85.0    23.0
        王五  131.0   72.0    96.0
二班  張三  48.0    142.0   108.0
        李四  126.0   85.0    122.0
        王五  72.0    49.0    53.0

二.pandas拼接操作

# 傳入行索引和列索引,返回一個(gè)DataFrame
def mk_df(inds, cols):
    data = {col: [col + str(i) for i in inds]  for col in cols}
    return DataFrame(data=data, index=inds, columns=cols)

mk_df([1,2,3,4], list('ABCD'))
輸出:
    A   B   C   D
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4
2.1 級聯(lián):pd.concat, pd.append
1) 簡單級聯(lián)

和np.concatenate一樣,優(yōu)先增加行數(shù)(默認(rèn)axis=0)

df1 = mk_df([1,2,3,4], list('ABCD'))
df2 = mk_df([1,2,3,4], list('ABCD'))
輸出:
    A   B   C   D
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4

    A   B   C   D
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4

pd.concat((df1,df2))
輸出:
    A   B   C   D
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4

#忽略原索引,重新進(jìn)行索引
pd.concat((df1,df2), ignore_index=True)
輸出:
    A   B   C   D
0   A1  B1  C1  D1
1   A2  B2  C2  D2
2   A3  B3  C3  D3
3   A4  B4  C4  D4
4   A1  B1  C1  D1
5   A2  B2  C2  D2
6   A3  B3  C3  D3
7   A4  B4  C4  D4

#可以通過設(shè)置axis來改變級聯(lián)方向
pd.concat((df1,df2), axis=1, ignore_index=True)
輸出:
    0   1   2   3   4   5   6   7
1   A1  B1  C1  D1  A1  B1  C1  D1
2   A2  B2  C2  D2  A2  B2  C2  D2
3   A3  B3  C3  D3  A3  B3  C3  D3
4   A4  B4  C4  D4  A4  B4  C4  D4

#或者使用多層索引 keys
#concat([x,y],keys=['x','y'])
# 通過keys可以給拼接起來的索引做一個(gè)說明.
pd.concat((df1,df2), keys=['df1', 'df2'])
輸出:
        A   B   C   D
df1 1   A1  B1  C1  D1
    2   A2  B2  C2  D2
    3   A3  B3  C3  D3
    4   A4  B4  C4  D4
df2 1   A1  B1  C1  D1
    2   A2  B2  C2  D2
    3   A3  B3  C3  D3
    4   A4  B4  C4  D4
2) 不匹配級聯(lián)

不匹配指的是級聯(lián)的維度的索引不一致。例如縱向級聯(lián)時(shí)列索引不一致,橫向級聯(lián)時(shí)行索引不一致

df3 = mk_df([3,4,5,6], list('CDEF'))
df3
輸出:
    C   D   E   F
3   C3  D3  E3  F3
4   C4  D4  E4  F4
5   C5  D5  E5  F5
6   C6  D6  E6  F6

pd.concat((df1,df3), sort=True)
輸出:
    A   B   C   D   E   F
1   A1  B1  C1  D1  NaN NaN
2   A2  B2  C2  D2  NaN NaN
3   A3  B3  C3  D3  NaN NaN
4   A4  B4  C4  D4  NaN NaN
3   NaN NaN C3  D3  E3  F3
4   NaN NaN C4  D4  E4  F4
5   NaN NaN C5  D5  E5  F5
6   NaN NaN C6  D6  E6  F6

pd.concat((df1,df3), sort=True, axis=1)
輸出:
    A   B   C   D   C   D   E   F
1   A1  B1  C1  D1  NaN NaN NaN NaN
2   A2  B2  C2  D2  NaN NaN NaN NaN
3   A3  B3  C3  D3  C3  D3  E3  F3
4   A4  B4  C4  D4  C4  D4  E4  F4
5   NaN NaN NaN NaN C5  D5  E5  F5
6   NaN NaN NaN NaN C6  D6  E6  F6

有3種連接方式:

  • 外連接:補(bǔ)NaN(默認(rèn)模式)
  • 內(nèi)連接:只連接匹配的項(xiàng)
# 內(nèi)連接,只有匹配的索引才顯示
pd.concat((df1,df3), sort=True, axis=1, join='inner')
輸出:
    A   B   C   D   C   D   E   F
3   A3  B3  C3  D3  C3  D3  E3  F3
4   A4  B4  C4  D4  C4  D4  E4  F4
  • 連接指定軸 join_axes
# 相當(dāng)于左外連接
pd.concat((df1,df3), sort=True, axis=1, join_axes=[df1.index])
輸出:
    A   B   C   D   C   D   E   F
1   A1  B1  C1  D1  NaN NaN NaN NaN
2   A2  B2  C2  D2  NaN NaN NaN NaN
3   A3  B3  C3  D3  C3  D3  E3  F3
4   A4  B4  C4  D4  C4  D4  E4  F4

# 右外連接
pd.concat((df1,df3), sort=True, axis=1, join_axes=[df3.index])
輸出:
    A   B   C   D   C   D   E   F
3   A3  B3  C3  D3  C3  D3  E3  F3
4   A4  B4  C4  D4  C4  D4  E4  F4
5   NaN NaN NaN NaN C5  D5  E5  F5
6   NaN NaN NaN NaN C6  D6  E6  F6
3) 使用append()函數(shù)添加

由于在后面級聯(lián)的使用非常普遍,因此有一個(gè)函數(shù)append專門用于在后面添加

df1.append(df3)
2.2 合并:pd.merge

merge與concat的區(qū)別在于,merge需要依據(jù)某一共同的行或列來進(jìn)行合并
使用pd.merge()合并時(shí),會自動根據(jù)兩者相同column名稱的那一列,作為key來進(jìn)行合并。
注意每一列元素的順序不要求一致

1) 一對一合并
df1 = DataFrame({'name':['張三','李四','Chales'],'id':[1,2,3],'age':[22,21,25]})

df2 = DataFrame({'sex':['男','男','女'],'id':[2,3,4],'group':['sale','search','service']})
display(df1,df2)
輸出:
   name id  age
0   張三  1   22
1   李四  2   21
2   Chales 3 25

    sex id  group
0   男   2   sale
1   男   3   search
2   女   4   service

pd.merge(df1, df2)
輸出:
    name    id  age sex group
0   李四  2   21  男   sale
1   Chales  3   25  男   search
2) 多對一合并
df1 = DataFrame({'name':['張三','李四','Chales'],'id':[1,2,2],'age':[22,21,25]})

df2 = DataFrame({'sex':['男','男','女'],'id':[2,3,4],'group':['sale','search','service']})
display(df1,df2)
輸出:
   name id  age
0   張三  1   22
1   李四  2   21
2   Chales  2   25

  sex   id  group
0   男   2   sale
1   男   3   search
2   女   4   service
#merge,即可用pd.merge,也可以df1.merge
df1.merge(df2)
輸出:
    name    id  age sex group
0   李四  2   21  男   sale
1   Chales  2   25  男   sale
3) 多對多合并
df1 = DataFrame({'name':['張三','李四','張三'],'salary':[10000,12000,20000],'age':[22,21,25]})

df2 = DataFrame({'sex':['男','男','女'],'name':['張三','張三','凡凡'],'group':['sale','search','service']})
display(df1,df2)
輸出:
  name  salary  age
0   張三  10000   22
1   李四  12000   21
2   張三  20000   25

  sex   name    group
0   男   張三  sale
1   男   張三  search
2   女   凡凡  service

pd.merge(df1,df2)
輸出:
  name  salary  age sex group
0   張三  10000   22  男   sale
1   張三  10000   22  男   search
2   張三  20000   25  男   sale
3   張三  20000   25  男   search
4) key的規(guī)范化
  • 使用on=顯式指定哪一列為key,當(dāng)有多個(gè)key相同時(shí)使用
df1 = DataFrame({'name':['張三','李四','張三'],'salary':[10000,12000,20000],'age':[22,21,25]})

df2 = DataFrame({'age':[21,18,29],'name':['張三','張三','凡凡'],'group':['sale','search','service']})
display(df1,df2)
輸出:
  name  salary  age
0   張三  10000   22
1   李四  12000   21
2   張三  20000   25

    age name    group
0   21  張三  sale
1   18  張三  search
2   29  凡凡  service

pd.merge(df1,df2, on='name', suffixes=['_df1', '_df2'])
輸出:
  name  salary  age_df1 age_df2 group
0   張三  10000   22  21  sale
1   張三  10000   22  18  search
2   張三  20000   25  21  sale
3   張三  20000   25  18  search
  • 使用left_on和right_on指定左右兩邊的列作為key,當(dāng)左右兩邊的key都不相等時(shí)使用
df1 = DataFrame({'name':['張三','李四','張三'],'salary':[10000,12000,20000],'age':[22,21,25]})

df2 = DataFrame({'年齡':[21,18,29],'名字':['張三','張三','凡凡'],'group':['sale','search','service']})
display(df1,df2)
輸出:
  name  salary  age
0   張三  10000   22
1   李四  12000   21
2   張三  20000   25

  年齡    名字  group
0   21  張三  sale
1   18  張三  search
2   29  凡凡  service

pd.merge(df1,df2, left_on='name', right_on='名字')
輸出:
  name  salary  age 年齡  名字  group
0   張三  10000   22  21  張三  sale
1   張三  10000   22  18  張三  search
2   張三  20000   25  21  張三  sale
3   張三  20000   25  18  張三  search
  • 當(dāng)左邊的列和右邊的index相同的時(shí)候,使用right_index=True
df1 = DataFrame({'name':['張三','李四','張三'],'salary':[10000,12000,20000],'age':[22,21,25]})

df2 = DataFrame({'年齡':[21,18,29],'名字':['張三','張三','凡凡'],'group':['sale','search','service']},
                index = [22,21,25])
display(df1,df2)
輸出:
  name  salary  age
0   張三  10000   22
1   李四  12000   21
2   張三  20000   25

    年齡  名字  group
22  21  張三  sale
21  18  張三  search
25  29  凡凡  service

pd.merge(df1, df2, left_on='age', right_index=True)
輸出:
  name  salary  age 年齡  名字  group
0   張三  10000   22  21  張三  sale
1   李四  12000   21  18  張三  search
2   張三  20000   25  29  凡凡  service
5) 內(nèi)合并與外合并
  • 內(nèi)合并:只保留兩者都有的key(默認(rèn)模式)
df1 = DataFrame({'name':['張三','李四','張三'],'salary':[10000,12000,20000],'age':[22,21,25]})

df2 = DataFrame({'age':[21,18,29],'名字':['張三','張三','凡凡'],'group':['sale','search','service']})
display(df1,df2)
輸出:
    name    salary  age
0   張三  10000   22
1   李四  12000   21
2   張三  20000   25

    age 名字  group
0   21  張三  sale
1   18  張三  search
2   29  凡凡  service

pd.merge(df1,df2,left_on='name', right_on='名字') 
# 默認(rèn)是內(nèi)連接 ,即顯示匹配的內(nèi)容,不匹配的內(nèi)容不顯示.
輸出:
  name  salary  age_x   age_y   名字  group
0   張三  10000   22  21  張三  sale
1   張三  10000   22  18  張三  search
2   張三  20000   25  21  張三  sale
3   張三  20000   25  18  張三  search
  • 外合并 how='outer':補(bǔ)NaN
# 外合并會顯示兩張表的全部信息.
pd.merge(df1,df2,left_on='name', right_on='名字', how='outer') 
輸出:
  name  salary  age_x   age_y   名字  group
0   張三  10000.0 22.0    21.0    張三  sale
1   張三  10000.0 22.0    18.0    張三  search
2   張三  20000.0 25.0    21.0    張三  sale
3   張三  20000.0 25.0    18.0    張三  search
4   李四  12000.0 21.0    NaN NaN NaN
5   NaN NaN NaN 29.0    凡凡  service
  • 左合并、右合并:how='left',how='right'
# left左合并只顯示左側(cè)表的所有信息.
pd.merge(df1,df2,left_on='name', right_on='名字', how='left') 
輸出:
    name    salary  age_x   age_y   名字  group
0   張三  10000   22  21.0    張三  sale
1   張三  10000   22  18.0    張三  search
2   李四  12000   21  NaN NaN NaN
3   張三  20000   25  21.0    張三  sale
4   張三  20000   25  18.0    張三  search

# right 右合并,只顯示右側(cè)表的所有信息. 
pd.merge(df1,df2,left_on='name', right_on='名字', how='right') 
輸出:

  name  salary  age_x   age_y   名字  group
0   張三  10000.0 22.0    21  張三  sale
1   張三  20000.0 25.0    21  張三  sale
2   張三  10000.0 22.0    18  張三  search
3   張三  20000.0 25.0    18  張三  search
4   NaN NaN NaN 29  凡凡  service
6) 列沖突的解決

當(dāng)列沖突時(shí),即有多個(gè)列名稱相同時(shí),需要使用on=來指定哪一個(gè)列作為key,配合suffixes指定沖突列名

#期中
df1 = DataFrame({'name':['張三','李四','張三'],'degree':[120,118,149],'age':[22,21,25]})

#期末考試
df2 = DataFrame({'degree':[99,97,129],'name':['張三','張三','凡凡'],'group':['sale','search','service']})
display(df1,df2)
輸出:

  name  degree  age
0   張三  120 22
1   李四  118 21
2   張三  149 25

  degree    name    group
0   99  張三  sale
1   97  張三  search
2   129 凡凡  service

pd.merge(df1,df2,on='name', suffixes=['_df1','_df2'])
輸出:
    name    degree_df1  age degree_df2  group
0   張三  120 22  99  sale
1   張三  120 22  97  search
2   張三  149 25  99  sale
3   張三  149 25  97  search

可以使用suffixes=自己指定后綴

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容