【数据科学】05 数据合并(merge、concat、combine)与数据清洗(缺失值、重复值、内容和格式)


1. 数据合并

实际应用中,需要分析的数据可能来自不同的数据集,因此在开始数据分析之前,需要先将不同的数据集合并。
pandas中提供了三种不同的数据合并方式:

  1. Pandas.merge():数据库方式的数据连接,可根据一个或多个键,将不同DataFrame对象的行连接起来;
  2. Pandas.concat():轴向数据连接,沿着一条轴,将多个DataFrame对象堆叠到一起;
  3. Pandas.combine():用一个DataFrame对象中的数据填充另一个DataFrame对象中的缺失数据。

1.1 merge()合并

pd.merge(left,right,[参数列表])

参数说明
left参与合并的左侧DataFrame对象,必填
right参与合并的右侧DataFrame对象,必填
how连接方式,“inner”、“outer”、“left”、“right”其中之一,默认为“inner”
on用于连接的列名(或列名列表);未指定改参数时,为左右数据集的公共列
left_on左侧DataFrame对象中用于连接的键
right_on右侧DataFrame对象中用于连接的键
left_index布尔型,是否将左侧DataFrame对象的行索引用作连接键
right_index布尔型,是否将右侧DataFrame对象的行索引用作连接键
sort是否根据连接键对合并后的数据排序,默认为True
suffixes字符串值元组,用于追加到重叠列名的末尾,默认为‘_x’和‘_y’

inner:内连接,连接两个DataFrame对象键值的交集的行
outer:外连接,连接两个DataFrame对象键值的并集的行
left:左链接,取出左侧DataFrame对象的全部行,连接右侧DataFrame对象键值匹配的行
right:右链接,取出右侧DataFrame对象的全部行,连接左侧DataFrame对象键值匹配的行

1.2 concat()合并

pd.concat(objs,axis,[参数列表])

参数说明
objs需要连接的对象,如[df1, df2]
axis连接的轴,默认为0;axis=0,按行堆叠;axis=1,按列堆叠
join默认为“outer”,outer为并集/inner为交集
ignore_indexignore_index 忽略需要连接的frame本身的index,当原本的index没有特别意义的时候可以使用
join_axesIndex对象列表,用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑
keys可以给每个需要连接的df一个label
levels序列列表,默认值无;用于构建MultiIndex的特定级别(唯一值)
nameslist,default无,结果层次索引中的级别的名称
verify_integrityboolean,default False;检查新连接的轴是否包含重复项
copyboolean,default True

1.3 combine()合并

  • df1.combine_first(df2)
    专门针对df1中的空值进行处理。
    当行、列索引相同时:用df2数据集来填充df1中的缺失值
    当行、列索引不同时:结果中的列是两个数据集列的并集,结果中的行是两个数据集行的并集,并用df2的对应值填充df1中的NA值
    在这里插入图片描述

  • df.combine(other, func, fill_value=None, overwrite=True)
    基于传递的函数执行与另一个DataFrame的逐列组合。
    使用func将DataFrame与其他 DataFrame 组合到按元素组合的列。生成的DataFrame的行索引和列索引将是两者的并集。

参数说明
otherDataFrame,要按列合并的DataFrame
func将两个系列作为输入并返回一个Series或一个标量的函数,用于逐列合并两个数据帧
fill_value标量值,默认None;在将任何列传递给合并函数之前填充NaN的值
overwriteboolean,默认为True;如果为true,列自我不存在在其他将与NaN的覆盖
# combine实现combine_first的逻辑
import pandas as pd
df = pd.DataFrame(
    {"A": ["001", None, "003", None, "005"],
     "B": ["1", "2", "3", "4", "5"]})
df["A"] = df["A"].combine(df["B"], lambda a, b: a if pd.notna(a) else b)

2. 数据清洗

2.1 缺失值

1. 识别缺失值

  • df.isnull()
    判断dataframe每行每列的元素是否为缺失值,分别用False和True表示
  • df.isnull().any() && df.isnull().any(1)
    查看所有列、行是否缺失值
  • df.isnull().all() && df.isnull().all(1)
    查看所有列、行是否全部为缺失值

2. 处理缺失值

  • 滤除缺失值
    df.dropna(how, axis, thresh, inplace)
参数说明
how取值为any或all,how=‘all’值丢弃全部NA的行(列)
axis轴向参数,默认为0;axis=0,丢弃行数据;axis=1,丢弃列数据
thresh保留部分观测数据,例如thresh=3,则当一行(列)有3个或以上非NA值才保留
inplace默认为False;inplace=True表示修改调用者而不产生副本
  • 填充缺失值
    df.fillna()
参数说明
value用于填充缺失值的标量值或字典对象
method用于填充缺失值的方法。method=‘ffill’,向前填充;method=‘bfill’,向后填充。也可以使用平均值或中位数等统计学方法,如method=df.mean()
axis待填充的轴,默认axis=0,按列填充
inplace默认为False;inplace=True表示修改调用者而不产生副本

注:不同列的缺失值用不同的数值来填充,需要构造{列索引名:值}形式的字典对象作为参数。

#把体重的缺失值用该列的均值填充,心率缺失值用默认值75填充
patient_data.fillna({'体重':patient_data['体重'].mean(),'心率':75}, inplace=True)

2.2 重复值

1. 查看重复值
df.duplicated()
查看DataFrame对象df中是否有重复行,返回一个布尔型的Series

2. 删除重复值
df.drop_duplicates()
删除df中重复的数据行,结果中默认保留第一个出现的值组合,传入take_last=True则保留最后一个。

注:上面的两个方法会默认判断全部列,也可以对部分列进行重复项判断或删除,只需传入列名或列名的列表。

df.drop_duplicates(['column_a'])

2.3 内容与格式清洗

1. replace数据替换
df.replace(to_replace,value,[参数列表])

参数说明
to_replace要替换掉的值
value替换后的新值
inplace是否修改原始数据,默认为False

如果一次需要修改多个值,则可以传入一个列表和要替换的值:

df.replace([270,1400],np.nan)   #把270,1400 均替换成NaN

对不同的值进行不同的替换,传入一个替换关系组成的列表或字典:

df.replace({'U.S.A.':'USA','U.K.':'UK'})

2. iterrows()迭代器遍历
df.iterrows()
iterrows()返回值为元组(index,row)

# 将单位为cm的身高单位统一为m
for index,row in patient_data[rows_with_cm].iterrows():  #使用迭代器
        height =float(row['身高'][:-2])/100  #身高转换为以m为单位
        patient_data.at[i,'身高(m)'] = '{}'.format(round(height,2))
  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值