(100天2小时第二十四天)数据整理—合并数据集

一、数据库风格的合并

df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
print(df1)
df2=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
print(df2)
print(pd.merge(df1,df2))#数据合并
  key  data1
0   b      0
1   b      1
2   a      2
3   c      3
4   a      4
5   a      5
6   b      6
  key  data2
0   a      0
1   b      1
2   d      2
  key  data1  data2
0   b      0      1
1   b      1      1
2   b      6      1
3   a      2      0
4   a      4      0
5   a      5      0

1.当没有指明用哪一列进行连接时,程序将自动按重叠列的列名进行连接,上述语句就是按重叠列“key”列进行连接。也可以通过on来指定连接列进行连接。

print(pd.merge(df1,df2,on='key'))
 key  data1  data2
0   b      0      1
1   b      1      1
2   b      6      1
3   a      2      0
4   a      4      0
5   a      5      0

2.当两个对象的列名不同时,即两个对象没有共同列时,也可以分别进行指定。

df3=pd.DataFrame({'key1':['b','b','a','c','a','a','b'],'data1':range(7)})
df4=pd.DataFrame({'key2':['a','b','d'],'data2':range(3)})
print(pd.merge(df3,df4,left_on='key1',right_on='key2'))
  key1  data1 key2  data2
0    b      0    b      1
1    b      1    b      1
2    b      6    b      1
3    a      2    a      0
4    a      4    a      0
5    a      5    a      0

3.通过上面的语句得到的结果里面只有a和b对应的数据,c和d以及与之相关的数据被消去,这是因为默认情况下,merge做的是‘inner’连接,即sql中的内连接,取得两个对象的交集。也有其他方式连接:left、right、outer。用“how”来指明。

df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
print(pd.merge(df1,df2,how='left'))
  key  data1  data2
0   b      0    1.0
1   b      1    1.0
2   a      2    0.0
3   c      3    NaN
4   a      4    0.0
5   a      5    0.0
6   b      6    1.0

 4.也可以根据多个键(列)进行合并,用on传入一个由列名组成的列表即可。

left=pd.DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','three'],'lval':[1,2,3]})
right=pd.DataFrame({'key1':['foo','foo','bar','bar'],'key2':['one','one','one','two'],'ravl':[4,5,6,7]})
print(pd.merge(left,right,on=['key1','key2'],how='outer'))
  key1   key2  lval  ravl
0  foo    one   1.0   4.0
1  foo    one   1.0   5.0
2  foo    two   2.0   NaN
3  bar  three   3.0   NaN
4  bar    one   NaN   6.0
5  bar    two   NaN   7.0

 二、索引上的合并

1.普通索引的合并

  Left_index表示将左侧的行索引引用做其连接键,right_index表示将右侧的行索引引用做其连接键

 上面两个用于DataFrame中的连接键位于其索引中,可以使用Left_index=True或right_index=True或两个同时使用来进行键的连接。

left1=pd.DataFrame({'key':['a','b','a','a','b','c'],'data1':range(6)})
print(left1)
right1=pd.DataFrame({'group_val':[3.5,7]},index=['a','b'])
print(right1)
print(pd.merge(left1,right1,left_on='key',right_index=True))
  key  data1
0   a      0
1   b      1
2   a      2
3   a      3
4   b      4
5   c      5
   group_val
a        3.5
b        7.0
  key  data1  group_val
0   a      0        3.5
2   a      2        3.5
3   a      3        3.5
1   b      1        7.0
4   b      4        7.0

2.层次化索引

与数据库中用on来根据多个键合并一样。

三、轴向连接(合并)

轴向连接,默认是在轴方向进行连接,也可以通过axis=1使其进行横向连接。

1.对于numpy对象(数组)可以用numpy中的concatenation函数进行合并。

arr=np.arange(12).reshape(3,4)
print(arr)
print(np.concatenate([arr,arr]))#纵向连接
print(np.concatenate([arr,arr],axis=1))#横向连接
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

[[ 0  1  2  3  0  1  2  3]
 [ 4  5  6  7  4  5  6  7]
 [ 8  9 10 11  8  9 10 11]]

2.对于pandas对象(如Series和DataFrame),可以pandas中的concat函数进行合并。

s1=pd.Series([0,1],index=['a','b'])
s2=pd.Series([2,3,4],index=['c','d','e'])
s3=pd.Series([5,6],index=['f','g'])
print(pd.concat([s1,s2,s3]))
a    0
b    1
c    2
d    3
e    4
f    5
g    6
dtype: int64

四、合并重叠数据

1.对于索引全部或部分重叠的两个数据集,我们可以使用numpy的where函数来进行合并,where函数相当于if—else函数。

a=pd.Series([1,2.5,3,3.5,4.5,5],index=['f','e','d','c','b','a'])
b=pd.Series([2,2.5,3,3.5,4,5],index=['f','e','d','c','b','a'])
print(np.where(pd.isnull(a),b,a))

 

[1.  2.5 3.  3.5 4.5 5. ]

2.对于重复的数据显示出相同的数据,而对于不同的数据显示a列表的数据。同时也可以使用combine_first的方法进行合并。合并原则与where函数一致,遇到相同的数据显示相同数据,遇到不同的显示a列表数据。

a=pd.Series([1,2.5,3,3.5,4.5,5],index=['f','e','d','c','b','a'])
b=pd.Series([2,2.5,3,3.5,4,5],index=['f','e','d','c','b','a'])
#print(np.where(pd.isnull(a),b,a))
print(a.combine_first(b))

 

f    1.0
e    2.5
d    3.0
c    3.5
b    4.5
a    5.0
dtype: float64

 

总结:

1.使用pd.merge(df1,df2)进行数据合并,重叠索引用on来指定连接列进行连接。当两个对象没有共同列时,用left_on、right_on分别进行制定。

2.默认情况下,merge做的是‘inner’连接,即sql中的内连接,取得两个对象的交集。

3.numpy中,可以用concatenation函数进行合并。

  pandas中,可以用concat函数进行合并。

3.对于索引全部或部分重叠的两个数据集,我们可以使用numpy的where函数或combine_first()函数来进行合并

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值