pip是 Python 的包管理工具,全称是 Python Install Packages,所有人都可以下载或上传自己开发的库到 PyPI 上,常见的指令有:
一、Series对象
Series对象是pandas中可存储多种类型的一维数组,由数据与索引组成。
默认索引为0
1 2 3
| import pandas as pd s1=pd.Series([1,2,3,4,5]) print(s1)
|
这里就可以采用位置进行索引
自定义索引
1 2 3
| import pandas as pd s1=pd.Series([1,2,3,4,5],index=['a','b','c','d','e']) print(s1)
|
这里就可以使用自定义的标签进行索引
同时上述两种方法也都可以支持切片索引
1 2 3
| import pandas as pd s1=pd.Series([1,2,3,4,5],index=['a','b','c','d','e']) print(s1['a':'d'])
|
我们也可以同时获取数据与索引
1 2 3 4
| import pandas as pd s1=pd.Series([1,2,3,4,5],index=['a','b','c','d','e']) print(s1.index) print(s1.values)
|
1 2
| Index(['a', 'b', 'c', 'd', 'e'], dtype='object') [1 2 3 4 5]
|
二、DataFrame对象
1 2
| pandas.DataFrame(data,index,columns)
|
列表创建DataFrame对象
当对象更注重列方向数据关联时:
1 2 3 4 5
| import pandas as pd data=[[110,135,125],[115,140,130],[120,145,135]] columns=['语文','数学','英语'] df=pd.DataFrame(data=data,columns=columns) print(df)
|
字典创建DataFrame对象
当对象更注重行方向数据关联时:
1 2 3 4 5 6 7 8
| import pandas as pd df=pd.DataFrame({ '语文':[110,115,120], '数学':[135,140,145], '英语':[125,130,135], '班级':'24-3班' }) print(df)
|
1 2 3 4
| 语文 数学 英语 班级 0 110 135 125 24-3班 1 115 140 130 24-3班 2 120 145 135 24-3班
|
三、导入外部数据
导入 .xls 和 .xlsx 文件
1
| pandas.read_excel(file_path,sheet_name)
|
默认情况下,sheet_name参数为0,表示读取第一个工作表。
sheet_name=1 表示读取第二个工作表
sheet_name='sheet_name' 表示读取指定名称的工作表
sheet_name=None 读取所有工作表
sheet_name=[1,2,'Sheet4'] 读取指定索引或名称的工作表
1 2 3 4
| import pandas as pd df=pd.read_excel('附件.xlsx','男胎检测数据') print(df.head()) print(df.tail())
|
1 2 3 4 5 6
| 序号 孕妇代码 年龄 身高 体重 ... 被过滤掉读段数的比例 染色体的非整倍体 怀孕次数 生产次数 胎儿是否健康 0 1 A001 31 160.0 72.0 ... 0.027484 NaN 1 0 是 1 2 A001 31 160.0 73.0 ... 0.019617 NaN 1 0 是 2 3 A001 31 160.0 73.0 ... 0.022312 NaN 1 0 是 3 4 A001 31 160.0 74.0 ... 0.023280 NaN 1 0 是 4 5 A002 32 149.0 74.0 ... 0.024212 NaN 2 1 否
|
行/列索引
1 2 3 4 5
| import pandas as pd df=pd.read_excel('附件.xlsx','男胎检测数据',index_col=3) print(df.head()) print(df.tail())
|
1 2 3 4 5
| import pandas as pd df=pd.read_excel('附件.xlsx','男胎检测数据',header=None) print(df.head()) print(df.tail())
|
导入指定行/列
1 2 3 4 5
| import pandas as pd df=pd.read_excel('附件.xlsx','男胎检测数据',usecols=[1]) print(df.head()) print(df.tail())
|
usecols=[1,2,3] 指定多列进行导入,导入第1、2、3列的数据
usecols='A:C' 导入A列到C列的数据
1 2 3 4 5 6
| 序号 孕妇代码 年龄 0 1 A001 31 1 2 A001 31 2 3 A001 31 3 4 A001 31 4 5 A002 32
|
usecols=['孕妇代码','年龄'] 导入指定列名的数据
四、数据清洗
(一)缺失值处理
查找缺失值
1 2 3
| import pandas as pd df=pd.read_excel('附件.xlsx','男胎检测数据') print(df.info())
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <class 'pandas.core.frame.DataFrame'> RangeIndex: 1082 entries, 0 to 1081 Data columns (total 31 columns): --- ------ -------------- ----- 0 序号 1082 non-null int64 1 孕妇代码 1082 non-null object 2 年龄 1082 non-null int64 3 身高 1082 non-null float64 4 体重 1082 non-null float64 5 末次月经 1070 non-null object 6 IVF妊娠 1082 non-null object 7 检测日期 1082 non-null object 8 检测抽血次数 1082 non-null int64 9 检测孕周 1082 non-null object 10 孕妇BMI 1082 non-null float64 11 原始读段数 1082 non-null int64 12 在参考基因组上比对的比例 1082 non-null float64 13 重复读段的比例 1082 non-null float64 14 唯一比对的读段数 1082 non-null int64 15 GC含量 1082 non-null float64 16 13号染色体的Z值 1082 non-null float64 17 18号染色体的Z值 1082 non-null float64 18 21号染色体的Z值 1082 non-null float64 19 X染色体的Z值 1082 non-null float64 20 Y染色体的Z值 1082 non-null float64 21 Y染色体浓度 1082 non-null float64 22 X染色体浓度 1082 non-null float64 23 13号染色体的GC含量 1082 non-null float64 24 18号染色体的GC含量 1082 non-null float64 25 21号染色体的GC含量 1082 non-null float64 26 被过滤掉读段数的比例 1082 non-null float64 27 染色体的非整倍体 126 non-null object 28 怀孕次数 1082 non-null object 29 生产次数 1082 non-null int64 30 胎儿是否健康 1082 non-null object dtypes: float64(17), int64(6), object(8) memory usage: 262.2+ KB None
|
缺失值一般用NaN表示,在第三列中大部分非空数量为1082,而第二十七行为126行,说明第二十七行有缺失值。
也可以使用isnull()方法查看缺失值:
1 2 3
| import pandas as pd df=pd.read_excel('附件.xlsx','男胎检测数据') print(df.isnull())
|
1 2 3 4 5 6 7 8 9 10 11 12
| 序号 孕妇代码 年龄 身高 ... 染色体的非整倍体 怀孕次数 生产次数 胎儿是否健康 0 False False False False ... True False False False 1 False False False False ... True False False False 2 False False False False ... True False False False 3 False False False False ... True False False False 4 False False False False ... True False False False ... ... ... ... ... ... ... ... ... ... 1077 False False False False ... False False False False 1078 False False False False ... False False False False 1079 False False False False ... True False False False 1080 False False False False ... True False False False 1081 False False False False ... True False False False
|
删除缺失值
dropna()方法可以删除缺失值,默认情况下,删除所有行中有缺失值的行:
1 2 3 4
| import pandas as pd df=pd.read_excel('附件.xlsx','男胎检测数据') df.dropna(inplace=True) print(df)
|
未删除前:
1
| [1082 rows x 31 columns]
|
删除后:
填充缺失值
(二)重复值处理
判断重复值
duplicated()方法可以判断数据是否重复,若没有传入参数,则默认会按照所有列的组合来判断重复值,即如果两行的所有列的值完全相同,则判定为重复行,返回 True
1 2 3 4 5
| import pandas as pd df=pd.read_excel('附件.xlsx','男胎检测数据') df=df.duplicated('年龄')
print(df)
|
默认情况,无参数:
1 2 3 4 5
| 0 False 1 False 2 False 3 False 4 False
|
含参数,只判断某一列重复值:
1 2 3 4 5
| 0 False 1 True 2 True 3 True 4 False
|
删除重复值
drop_duplicates()方法可以删除重复值,默认情况下,删除所有行中有重复值的行:
1 2 3 4
| import pandas as pd df=pd.read_excel('附件.xlsx','男胎检测数据') df=df.drop_duplicates('孕妇代码') print(df)
|
1
| df=df.drop_duplicates('孕妇代码',keep='last')
|
参数默认保留重复的第一行,可选参数保留重复的最后一行或任意行
默认情况,无参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 序号 孕妇代码 年龄 身高 体重 ... 被过滤掉读段数的比例 染色体的非整倍体 怀孕次数 生产次数 胎儿是否健康 0 1 A001 31 160.0 72.00 ... 0.027484 NaN 1 0 是 1 2 A001 31 160.0 73.00 ... 0.019617 NaN 1 0 是 2 3 A001 31 160.0 73.00 ... 0.022312 NaN 1 0 是 3 4 A001 31 160.0 74.00 ... 0.023280 NaN 1 0 是 4 5 A002 32 149.0 74.00 ... 0.024212 NaN 2 1 否 ... ... ... .. ... ... ... ... ... ... ... ... 1077 1078 A266 30 159.0 83.35 ... 0.017951 T18 1 0 是 1078 1079 A267 28 155.0 73.76 ... 0.022549 T21 1 0 是 1079 1080 A267 28 155.0 74.06 ... 0.021330 NaN 1 0 是 1080 1081 A267 28 155.0 74.74 ... 0.022013 NaN 1 0 是 1081 1082 A267 28 155.0 75.85 ... 0.016906 NaN 1 0 是
[1082 rows x 31 columns]
|
含参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 序号 孕妇代码 年龄 身高 体重 ... 被过滤掉读段数的比例 染色体的非整倍体 怀孕次数 生产次数 胎儿是否健康 0 1 A001 31 160.0 72.00 ... 0.027484 NaN 1 0 是 4 5 A002 32 149.0 74.00 ... 0.024212 NaN 2 1 否 9 10 A003 35 160.0 78.70 ... 0.021138 T21 ≥3 1 是 15 16 A004 26 158.0 71.50 ... 0.021022 NaN ≥3 1 是 19 20 A005 30 150.0 67.40 ... 0.025210 NaN ≥3 1 是 ... ... ... .. ... ... ... ... ... ... ... ... 1062 1063 A263 30 157.0 72.34 ... 0.024222 T21 1 0 是 1066 1067 A264 30 171.0 94.95 ... 0.024366 NaN 1 0 是 1070 1071 A265 32 168.0 95.17 ... 0.025949 NaN 1 0 是 1074 1075 A266 30 159.0 81.24 ... 0.025132 T13T18 1 0 是 1078 1079 A267 28 155.0 73.76 ... 0.022549 T21 1 0 是
[267 rows x 31 columns]
|
(三)异常值处理
箱型线法
箱型线法是基于数据的四分位数构建 “箱体” 和 “须”,通过设定合理范围识别异常值,超过设定的上限或下限都可以被认定为异常值,具有不依赖数据分布、对极端值鲁棒的特点。
1 2 3 4 5 6 7 8 9 10 11 12 13
| import pandas as pd
df = pd.read_excel('附件.xlsx', '男胎检测数据')
Q1 = df['体重'].quantile(0.25) Q3 = df['体重'].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR
outliers_lower = df[df['体重'] < lower_bound] outliers_upper = df[df['体重'] > upper_bound] all_outliers = pd.concat([outliers_lower, outliers_upper])
|
删除异常值
1 2 3 4 5 6 7 8 9 10 11
| import pandas as pd
df = pd.read_excel('附件.xlsx', '男胎检测数据') Q1 = df['体重'].quantile(0.25) Q3 = df['体重'].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR
df_cleaned = df[(df['体重'] >= lower_bound) & (df['体重'] <= upper_bound)]
|
填充异常值
1 2 3 4 5 6 7 8 9 10 11 12 13
| import pandas as pd df = pd.read_excel('附件.xlsx', '男胎检测数据') Q1 = df['体重'].quantile(0.25) Q3 = df['体重'].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR
weight_median = df['体重'].median()
df.loc[df['体重'] < lower_bound, '体重'] = weight_median
df.loc[df['体重'] > upper_bound, '体重'] = weight_median
|
盖帽处理
1 2 3 4 5 6 7 8 9 10 11
| import pandas as pd df = pd.read_excel('附件.xlsx', '男胎检测数据') Q1 = df['体重'].quantile(0.25) Q3 = df['体重'].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR
df.loc[df['体重'] < lower_bound, '体重'] = lower_bound
df.loc[df['体重'] > upper_bound, '体重'] = upper_bound
|