数据分析(五)

numpy的级联

#concatenate((n1,n2),axis),axis指级联方向默认为0,列方向级联,1位行方向级联
n1 = np.random.randint(0,10, size=(3,3))
n2 = np.random.randint(10,20, size=(3,3))
np.concatenate((n1,n2), axis=1)
out:array([[ 9,  8,  0, 15, 19, 15],
       [ 1,  8,  5, 16, 17, 12],
       [ 7,  0,  9, 12, 12, 10]])

#hstack()函数行方向级联,vstack()列方向级联

pandas的级联

pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:

objs 要级联的DataFrame
axis=0
join='outer'
join_axes=None
ignore_index=False
keys = [value1,value2...]

  • 简单级联

    pd.concat((df1,df2))
    # axis可以改变级联方向,ignore_index能重新改变索引下标,keys可以多层索引,将[value1,value2...]变成index最外层索引
    
    
  • 不匹配级联

当要级联的行索引或者列索引不一致的时候会用NaN代替

  df1 = make_df(list('1234'), list('ABCD'))
  df2 = make_df(list('3456'), list('CDEF'))
  display(df1,df2)
  out:
    A   B   C   D
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4
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,df2), 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,df2), join='inner')#内级联

C   D
1   C1  D1
2   C2  D2
3   C3  D3
4   C4  D4
3   C3  D3
4   C4  D4
5   C5  D5
6   C6  D6
  pd.concat((df1,df2), join_axes=[df2.columns])#以某一个df为准进列索引内级联,并保留df

C   D   E   F
1   C1  D1  NaN NaN
2   C2  D2  NaN NaN
3   C3  D3  NaN NaN
4   C4  D4  NaN NaN
3   C3  D3  E3  F3
4   C4  D4  E4  F4
5   C5  D5  E5  F5
6   C6  D6  E6  F6
  • append()级联
df1.append(df2, sort=True)
out:

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.merge()合并
    merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并

    使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。

    注意每一列元素的顺序不要求一致

  • 一对一

df1 = DataFrame({'name':['张三','李四','Chales'],'id':[1,2,3],'age':[22,21,25]})
df2 = DataFrame({'sex':['男','男','女'],'id':[2,3,4],'group':['sale','search','service']})
out:
    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
  • 多对一
df1 = DataFrame({'name':['张三','李四','Chales'],'id':[1,2,2],'age':[22,21,25]})

df2 = DataFrame({'sex':['男','男','女'],'id':[2,3,4],'group':['sale','search','service']})
out:
    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
df1.merge(df2)
out:

name    id  age sex group
0   李四  2   21  男   sale
1   Chales  2   25  男   sale
  • 多对多
df1 = DataFrame({'name':['张三','李四','张三'],'salary':[10000,12000,20000],'age':[22,21,25]})

df2 = DataFrame({'sex':['男','男','女'],'name':['张三','张三','凡凡'],'group':['sale','search','service']})
out:
    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)
out:
    name    salary  age sex group
0   张三  10000   22  男   sale
1   张三  10000   22  男   search
2   张三  20000   25  男   sale
3   张三  20000   25  男   search
  1. 如果有多相同的列索引可以用on指定用什么合并
  2. 用left_on与right_on可以指定两个df分别用什么列索引合并
  3. 用left_index与right_index可以根据用index合并

你可能感兴趣的:(数据分析(五))