Python数据分析_Pandas学习__2
## 常用数据分析方法
# 查看数据的行数和列数 df.shape >>> (68630, 14) d1.count() #非空元素计算 d1.min() #最小值 d1.max() #最大值 d1.idxmin() #最小值的位置,类似于R中的which.min函数 d1.idxmax() #最大值的位置,类似于R中的which.max函数 d1.quantile(0.1) #10%分位数 d1.sum() #求和 d1.mean() #均值 d1.median() #中位数 d1.mode() #众数 d1.var() #方差 d1.std() #标准差 d1.mad() #平均绝对偏差 d1.skew() #偏度 d1.kurt() #峰度 d1.describe() #一次性输出多个描述性统计指标
数据清洗
去除多余字符
# 单列字段清洗-去空格 df['商品名称'] = df['商品名称'].map(lambda s : s.strip()) df['A']=df['A'].map(str.strip) # 去除两边空格 df['A']=df['A'].map(str.lstrip) # 去除左边空格 df['A']=df['A'].map(str.rstrip) # 去除右边空格 df['A']=df['A'].map(str.upper) # 转大写 df['A']=df['A'].map(str.lower) # 转小写 df['A']=df['A'].map(str.title) # 首字母大写 # 字段切分,并创建新特征 df.loc[:,"区域"] = df['仓库'].map(lambda s:s[0:2]) # 转换某特征(列)的数据格式 df['行号'] = df['行号'].astype(float) # 转化时间格式 df['time']=pd.to_datetime(df['time']) # eg: 处理 ['(1994)'] ,去除[],去除‘’,去除() df['上映日期'] = df['上映日期'].map(lambda s: s.strip('[]').strip("''").strip('()'))
缺失值处理
# 缺失值判断(在原数据对象以T/F替换) df.isnull() df['A'].isnull() # 非空值 df.notnull() # 缺失值计数方法 # 方法一 df['A'].isnull().value_counts() >>> True 68629 False 1 Name: A, dtype: int64 # 方法二 df['A'].isnull().sum() >>> 68629 df.isnull().sum() >>> 仓库 0 货号 0 条码 2 规格 62290 # 默认axi=0,how=‘any’,按行,任意一行有NaN就整列丢弃 df.dropna() df.dropna(axis=1) # 按列(axis=1),丢弃指定label的列,默认按行。。。 df.drop(labels, axis=1) # 一行中全部为NaN的,才丢弃 df.driopna(how='all') # 保留至少3个非空值的行:一行中有3个值是非空的就保留 df.dropna(thresh=3) # 缺失值填充 df.fillna(0)
值替换
# 将df的A列中 -999 全部替换成空值 df["A"].replace(-999, np.nan) #-999和1000 均替换成空值 obj.replace([-999,1000], np.nan) # -999替换成空值,1000替换成0 obj.replace([-999,1000], [np.nan, 0]) # 同上,写法不同,更清晰 obj.replace({-999:np.nan, 1000:0}) #eg: 替换[] 为中国,然后替换掉原来的列 df['国家地区'] = df['国家地区'].replace('[]', '中国')
重复值处理
# 返回布尔向量、矩阵 df['A'].duplicated() df.duplicated() # 保留k1列中的唯一值的行,默认保留第一行 df.drop_duplicated(["k1"]) # 保留 k1和k2 组合的唯一值的行,take_last=True 保留最后一行 df.drop_duplicated(["k1","k2"], take_last=True) # 返回唯一的数组 df['A'].unique() # eg:获取不重复数据 print(df[~df['国家地区'].duplicated()]['国家地区'])
数据切片
# 1、[]只能对 行(row/index) 切片,前闭后开 df[0:3] df[:4] df[4:] # 2、where布尔查找,建立在[]基础之上 df[df["A"]>7] # 3、isin()返回布尔值 df["A"].isin([1,2,3]) df.loc[df['sepal_length'].isin([5.8,5.1])] # 4、loc :根据名称Label切片 # df.loc[A,B] A是行范围,B是列范围 df.loc[1:4,['petal_length','petal_width']] # 5、iloc:切位置,以序列号去切 df.iloc[1:4,:] # 6、ix:混切 # 名称和位置混切,但效率低,少用 df1.ix[0:3,['sepal_length','petal_width']]
数据操作和判断
# 1、判断比较操作符 df[df["A"]>7] # 2、query 多个where整合切片,&:于,|:或 df.query(" A>5.0 & (B>3.5 | C<1.0) ") # 3、isin 返回布尔值 s.isin([1,2,3]) df['A'].isin([1,2,3]) # eg:选取列A中值为5.8,5.1的所有行组成dataframe df.loc[df['A'].isin([5.8,5.1])] # 4、contains 使用DataFrame模糊筛选数据(类似SQL中的LIKE) # 使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次 df[df['商品名称'].str.contains("四件套")] df[df['商品名称'].str.contains(r".*四件套.*")]、 # 5、map与lambda 自定义函数应用于Series每个元素 map(lambda s: s.strip('[]').strip("''").strip('()')) map(lambda s : s+1, alist)