1. 数据合并
实际应用中,需要分析的数据可能来自不同的数据集,因此在开始数据分析之前,需要先将不同的数据集合并。
pandas中提供了三种不同的数据合并方式:
Pandas.merge()
:数据库方式的数据连接,可根据一个或多个键,将不同DataFrame对象的行连接起来;Pandas.concat()
:轴向数据连接,沿着一条轴,将多个DataFrame对象堆叠到一起;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_index | ignore_index 忽略需要连接的frame本身的index,当原本的index没有特别意义的时候可以使用 |
join_axes | Index对象列表,用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑 |
keys | 可以给每个需要连接的df一个label |
levels | 序列列表,默认值无;用于构建MultiIndex的特定级别(唯一值) |
names | list,default无,结果层次索引中的级别的名称 |
verify_integrity | boolean,default False;检查新连接的轴是否包含重复项 |
copy | boolean,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的行索引和列索引将是两者的并集。
参数 | 说明 |
---|---|
other | DataFrame,要按列合并的DataFrame |
func | 将两个系列作为输入并返回一个Series或一个标量的函数,用于逐列合并两个数据帧 |
fill_value | 标量值,默认None;在将任何列传递给合并函数之前填充NaN的值 |
overwrite | boolean,默认为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))