Pandas-合并

本文深入探讨Pandas库中高级数据操作技巧,包括append、assign、combine、update、concat、merge与join等函数的应用场景及案例分析,通过实例讲解如何高效地进行数据整合、筛选与填充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

append和assign

append

#利用序列添加行(必须指定name)
s = pd.Series({'Gender':'F','Height':188},name='new_row')
df_append.append(s)
#用DataFrame添加表
df_temp = pd.DataFrame({'Gender':['F','M'],'Height':[188,176]},index=['new_1','new_2'])
df_append.append(df_temp)

assign
主要用于添加列

#添加列,列名直接由参数指定
s = pd.Series(list('abcd'),index=range(4))
df_append.assign(Letter=s)
#一次添加多个列
df_append.assign(col1=lambda x:x['Gender']*2,
                 col2=s)

combine和update

都是用于表的填充函数
combine

# 填充对象是表,按照表的顺序轮流进行逐列循环,自动索引对齐,缺失值为NaN
df1.combine(df2)
df_combine_1 = df.loc[:1,['Gender','Height']].copy()
df_combine_2 = df.loc[10:11,['Gender','Height']].copy()
df_combine_1.combine(df_combine_2,lambda x,y:print(x,y))

combine_first
用df2填补df1的缺失值,功能比较简单,较常用

df1 = pd.DataFrame({'A': [None, 0], 'B': [None, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
df1.combine_first(df2)

update
返回的框索引只会与被调用框的一致(默认使用左连接),第二个框中的nan元素不会起作用,没有返回值,直接在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)

concat

在两个维度上拼接,默认纵向凭借(axis=0),拼接方式默认外连接
外连接:取拼接方向的并集;内连接:取拼接方向(若使用默认的纵向拼接,则为列的交集)的交集
在这里插入图片描述
在这里插入图片描述

merge与join

merge
作用是将两个pandas对象横向合并,遇到重复的索引项时会使用笛卡尔积,默认inner连接,可选left、outer、right连接。

pandas.merge(left, right, how='inner', on=None, left_on=None,right_on=None, left_index=False, right_index=False, sort=False,suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
# 可多组连接
pd.merge(left, right, on=['key1','key2'])

join
作用是将多个pandas对象横向拼接,遇到重复的索引项时会使用笛卡尔积,默认左连接,可选inner、outer、right连接

# many_to_one模式下的合并,join更为方便
left.join(right, on='key')
# 可以指定key,多层key例子
left.join(right, on=['key1','key2'])

练习

【练习一】有2张公司的员工信息表,每个公司共有16名员工,共有五个公司,请解决如下问题:
(a) 每个公司有多少员工满足如下条件:既出现第一张表,又出现在第二张表。
(b) 将所有不符合(a)中条件的行筛选出来,合并为一张新表,列名与原表一致。
© 现在需要编制所有80位员工的信息表,对于(b)中的员工要求不变,对于满足(a)条件员工,它们在某个指标的数值,取偏离它所属公司中满足(b)员工的均值数较小的哪一个,例如:P公司在两张表的交集为{p1},并集扣除交集为{p2,p3,p4},那么如果后者集合的工资均值为1万元,且p1在表1的工资为13000元,在表2的工资为9000元,那么应该最后取9000元作为p1的工资,最后对于没有信息的员工,利用缺失值填充。

# (a)
pd.merge(df1,df2,on='Name').count()[1]
# (b)
name_list=pd.merge(df1,df2,on='Name')['Name'].values
name_list=list(name_list)
name_list
df11=df1[~df1['Name'].isin(name_list)]
df22=df2[~df2['Name'].isin(name_list)]
df_b=df11.append(df22).set_index('Name')
# (c)
# ……让我再学习下

【练习二】有2张课程的分数表(分数随机生成),但专业课(学科基础课、专业必修课、专业选修课)与其他课程混在一起,请解决如下问题:
(a) 将两张表分别拆分为专业课与非专业课(结果为四张表)。
(b) 将两张专业课的分数表和两张非专业课的分数表分别合并。
© 不使用(a)中的步骤,请直接读取两张表合并后拆分。
(d) 专业课程中有缺失值吗,如果有的话请在完成(3)的同时,用组内(3种类型的专业课)均值填充缺失值后拆分。

# (a)
df_1=df1[~((df1['课程类别']!='专业选修课')&(df1['课程类别']!='专业必修课')&(df1['课程类别']!='学科基础课'))]
# (b)
df_1=df1[~((df1['课程类别']!='专业选修课')&(df1['课程类别']!='专业必修课')&(df1['课程类别']!='学科基础课'))]
df_2=df1[(df1['课程类别']!='专业选修课')&(df1['课程类别']!='专业必修课')&(df1['课程类别']!='学科基础课')]
df_3=df2[~((df2['课程类别']!='专业选修课')&(df2['课程类别']!='专业必修课')&(df2['课程类别']!='学科基础课'))]
df_4=df2[(df2['课程类别']!='专业选修课')&(df2['课程类别']!='专业必修课')&(df2['课程类别']!='学科基础课')]
# (b)
df_12=df_1.append(df_2)
df_34=df_3.append(df_4)
# (c)
df=df1.append(df2)
dff1=df.query('课程类别 in ["学科基础课","专业必修课","专业选修课"]')
dff2=df.query('课程类别 not in ["学科基础课","专业必修课","专业选修课"]')
# (d)
df['分数'] = df.groupby('课程类别').transform(lambda x: x.fillna(x.mean()))['分数']
df.isnull().all()
special3 = df.query('课程类别 in ["学科基础课","专业必修课","专业选修课"]')
common3 = df.query('课程类别 not in ["学科基础课","专业必修课","专业选修课"]')
common3.head()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值