Pandas数据分析 ——Task05:合并

教程地址:joyful-pandas/第5章 合并——datawhalechina

一、append与assign

1. append方法

必须指定name

dff = df.loc[:3,['Gender','Height']].copy()   #取出原表中一部分

# 利用序列添加行
s = pd.Series({'Gender':'F','Height':188},name='new_row')   
dff_append1 = dff.append(s)  
# 利用DataFrame添加表
df_temp = pd.DataFrame({'Gender':['F','M'],'Height':[188,176]},index=['new_1','new_2'])
dff_append2 = dff.append(df_temp)
# 输出
print(dff,'\n',dff_append1,'\n',dff_append2)

结果:

  Gender  Height
0      M     173
1      F     192
2      M     186
3      F     167 
         Gender  Height
0            M     173
1            F     192
2            M     186
3            F     167
new_row      F     188 
       Gender  Height
0          M     173
1          F     192
2          M     186
3          F     167
new_1      F     188
new_2      M     176

2. assign方法

该方法主要用于添加列,列名直接由参数指定

# 添加单列(列名为Letter)
s = pd.Series(list('abcd'),index = range(4))
dff_assign1 = dff.assign(Letter = s)
# 添加多列
dff_assign2 = dff.assign(col1 = lambda x:x['Gender']*2,col2 = s)
# 输出
print(dff,'\n',dff_assign1,'\n',dff_assign2)

结果:

  Gender  Height
0      M     173
1      F     192
2      M     186
3      F     167 
   Gender  Height Letter
0      M     173      a
1      F     192      b
2      M     186      c
3      F     167      d 
   Gender  Height col1 col2
0      M     173   MM    a
1      F     192   FF    b
2      M     186   MM    c
3      F     167   FF    d

二、combine与update

1. comine方法

combine方法是按照表的顺序轮流进行逐列循环的,而且自动索引对齐

  • overwrite:是否覆盖原来符合条件的值(默认True)
  • fill_value:设置后面的表没有的行列的填充(默认为NaN)
# 根据列均值的大小填充,注意索引对齐特性
df1 = pd.DataFrame({'A': [6, 7], 'B': [8, 9]})
df2 = pd.DataFrame({'B': [8, 7], 'C': [6, 5]},index=[1,2])
dd = df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,
                 overwrite = False,fill_value = -1)
print(df1,'\n',df2,'\n',dd)

结果:

   A  B
0  6  8
1  7  9 
   B  C
1  8  6
2  7  5 
    A    B    C
0  6.0  8.0 -1.0
1  7.0  9.0  6.0
2  NaN -1.0  5.0

combine_first方法
这个方法作用是用df2填补df1的缺失值,功能比较简单,但很多时候会比combine更常用

df1 = pd.DataFrame({'A': [None, 0], 'B': [4, None]})
df2 = pd.DataFrame({'B': [3, 3], 'C': [1, 1]}, index=[1, 2])
dd = df1.combine_first(df2)
print(df1,'\n',df2,'\n',dd)

结果:注意(1,‘B’)处被填补的值

    A    B
0  NaN  4.0
1  0.0  NaN 
   B  C
1  3  1
2  3  1 
    A    B    C
0  NaN  4.0  NaN
1  0.0  3.0  1.0
2  NaN  3.0  1.0

2. update方法

  1. 返回的框索引只会与被调用框的一致(默认使用左连接
  2. 第二个框中的nan元素不会起作用
  3. 没有返回值,直接在df上操作
df1 = pd.DataFrame({'A': [1, 2, 3],'B': [400, 500, 600]})
df2 = pd.DataFrame({'B': [4, 5, 6],'C': [7, 8, 9]})
df1.update(df2) #结果更新到前者中
print(df1)      
df3 = pd.DataFrame({'B': [7, np.nan, 9]})
df1.update(df3) #缺失值不会填充
print(df1)

结果:

   A  B
0  1  4
1  2  5
2  3  6
   A   B
0  1  7.0
1  2  5.0
2  3  9.0

三、concat方法

concat方法可以在两个维度上拼接
部分参数如下:

  • axis:拼接方向(默认纵向拼接,即axis = 0)
  • join:拼接方式(默认外连接,取拼接方向的并集,而设置为 inner 时取拼接方向的交集)
  • sort:设置列排序(默认为False)
  • verify_integrity:检查列是否唯一
  • key:用于对不同的数据框增加一个标号,便于索引
df1 = pd.DataFrame({'A': ['A0', 'A1'],'B': ['B0', 'B1']},
                    index = [0,1])
df2 = pd.DataFrame({'A': ['A2', 'A3'],'B': ['B2', 'B3']},
                    index = [2,3])
df3 = pd.DataFrame({'A': ['A1', 'A3'],'D': ['D1', 'D3']
                    ,'E': ['E1', 'E3']},index = [1,3])
                    
dfc1 = pd.concat([df1,df2])         #纵向拼接
dfc2 = pd.concat([df1,df2],axis=1)  #横向拼接
dfc3 = pd.concat([df3,df1],join = 'inner')    #join设置为内连接,列取交集
print(dfc1,'\n',dfc2,'\n',dfc3)

结果:

    A   B
0  A0  B0
1  A1  B1
2  A2  B2
3  A3  B3 
      A    B    A    B
0   A0   B0  NaN  NaN
1   A1   B1  NaN  NaN
2  NaN  NaN   A2   B2
3  NaN  NaN   A3   B3
     A
1  A1
3  A3
0  A0
1  A1

同样,可以添加Series:

s = pd.Series(['X0', 'X1'], name='X')
dfc4 = pd.concat([df1,s],axis = 1)
print(dfc4)

结果:

    A   B   X
0  A0  B0  X0
1  A1  B1  X1

四、merge与join

1. merge函数

merge函数的作用是将两个pandas对象横向合并,遇到重复的索引项时会使用笛卡尔积(可用参数how修改,默认inner连接,可选left、outer、right连接)
所谓左连接,就是指以第一个表索引为基准,右边的表中如果不再左边的则不加入,如果在左边的就以笛卡尔积的方式加入
merge/join与concat的不同之处在于on参数,可以指定某一个对象为key来进行连接
为了更好地理解,下面给出几个例子:

dfl = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']}) 
dfr1 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
dfr2 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3']})
# print(dfl,'\n',dfr1,'\n',dfr2)
# 单键连接:若两df具有同名的列,则默认suffixes=('_x','_y')
df_merge1 = pd.merge(dfl, dfr1, on = 'key1')        
# 多键组合连接    
df_merge2 = pd.merge(dfl, dfr1, on = ['key1','key2']) 
# 外连接
df_merge3 = pd.merge(dfl, dfr1, how = 'outer', on = ['key1','key2'])
print(df_merge1,'\n',df_merge2,'\n',df_merge3)

结果:

  key1 key2_x   A   B key2_y   C   D
0   K0     K0  A0  B0     K0  C0  D0
1   K0     K1  A1  B1     K0  C0  D0
2   K1     K0  A2  B2     K0  C1  D1
3   K1     K0  A2  B2     K0  C2  D2
4   K2     K1  A3  B3     K0  C3  D3 
  key1 key2   A   B   C   D
0   K0   K0  A0  B0  C0  D0
1   K1   K0  A2  B2  C1  D1
2   K1   K0  A2  B2  C2  D2 
  key1 key2    A    B    C    D
0   K0   K0   A0   B0   C0   D0
1   K0   K1   A1   B1  NaN  NaN
2   K1   K0   A2   B2   C1   D1
3   K1   K0   A2   B2   C2   D2
4   K2   K1   A3   B3  NaN  NaN
5   K2   K0  NaN  NaN   C3   D3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值