一、数据读取
1. pandas 数据读取:
import pandas as pd
df = pd.read_csv("G:\\...\\NBA.csv",encoding=\'gbk\')
read_csv 的重要参数:
filepath_or_buffer: # 文件的路径,URL或任何具有read()方法的对象。 sep : # 分隔符,默认为 , header: # 列名 , 默认为 header=0 取第0行做为数据集的列名 names: # 指定数据集的列名称,配合header=None 使用 encoding: # 编码格式 na_values:["Nope , ..."] # 数据集中的字符串"Nope"被识别为NaN , ... keep_defalut_na: # 如果指定了na_values,并且keep_default_na是False默认的NaN值被覆盖 na_filter: # 默认True,对缺失值进行检测,False为不处理。 error_bad_lines: # 默认True,如果False,跳过错误行数据 warn_bad_lines: # 默认True,如果error_bad_lines为False,而warn_bad_lines为True,则会输出每个“坏行”的警告
2、Missing data 处理
DataFrame.dropna() # 返回没有NaN值的数据集 DataFrame.fillna(X) # 将X填充到数据集中的NaN值 DataFrame.replace([to_replace, value, ...]) # 将to_replace 替换为 value , # 例子: df.replace(np.nan,\'xx\',regex=False) # 将NaN值替换为xx , regex 若为True 将to_value 当作正则进行匹配!
二、DataFrame与Series
1、DataFrame 是一个表格型数据结构,既有行索引又有列索引,看作由Series组成的字典。
df = pd.read_csv("G:\\....\\NBA.csv",encoding=\'gbk\')
重要方法:
查看: head([n]) # 返回前n行 tail([n]) # 返回最后n行 df[\' 列名 \'] # 返回某一列的数据 df.列名 # 返回某一列的数据 添加 / 修改整列 : df[\' 列名 \'] = \'xxx \' # (添加/修改) 一列,内容为xxx 删除: del df[\' 列名 \'] # 删除某一列 df.pop(\'列名\') # 返回项目并从DataFrame中删除 列运算: df[col3] = df[col1] + df[col2] 判断: df[ \' 列名 \' ] > 100 # 符合显示 True , 否则False
重要属性:
1.index
df.index # RangeIndex(start=0, stop=3922, step=1) # 3922文件总行数 ,
2.columns 返回列名
df.columns # Index([\'序号\', \'Player\', \'height\', \'weight\', \'collage\', \'born\', \'birth_city\',\'birth_state\'],dtype=\'object\')
3.shape
df.shape # (3922, 8) 数据集一共3922行,8列
4.dtypes 返回每一列数据类型
df.dtypes # 序号 int64 # Player object # height float64 # weight float64 # collage object # born float64 # birth_city object # birth_state object # dtype: object
行选取
1.切片
df[:5] 或 df [10]
2.特殊的索引选取方式
df.iloc[0] # 返回索引为0的行信息
2、Series 一维数组对象,由一组数据和与之相关的数据标签(索引)组成。
series = df[\'列名\'] series = df.列名 # 筛选 s2 = series[ series > 100 ] # 返回大于100的数据集
属性:
series.index series.value
方法:
series.value_counts() # 出现频数 series.unique() # 返回对象中的唯一值的np.ndarray。 len( series.unique ) # 查看长度
3、创建DataFrame 与 Series
1、创建Series
# 1. 字典形式 :
sdata = {"A":\'123\',"B":\'456\'}
series1 = pd.Series( sdata )
# 2. 数组形式 :
series2 = pd.Series([1,2,3,4,5] ) # 默认索引从0 开始, ...
series2 = pd.Series([1,2,3,4,5] , index = [\'a\',\'b\',\'c\',\'d\',\'e\'] )
series2 = pd.Series([1,2,3,4,5] , index = list(\'abcde\') )
# 3. 实数形式 :
series3 = pd.Series(11 , index = list(\'abc\') )
2、创建DataFrame
# 1. 字典形式
# 一层字典:
data = {
\'state\':[\'Ohio\',\'Nevada\',\'Ohio\'],
\'year\':[1999,1888,1777],
\'pop\':[1.4,1.2,1.1]
}
df1 = pd.DataFrame(data) # 列名:pop,year,stats(乱序) , 行索引默认从0开始
df1 = pd.DataFrame(data , columns = [\'pop\',\'year\',\'stats\']) # 指定数据表中列名顺序
df1 = pd.DataFrame(data , index = [\'one\',\'two\',\'three\'] ) # 指定索引
# 两层字典:
data = {
\'A\':{\'user\':\'alex\',\'age\':20},
\'B\':{\'user\':\'eric\',\'age\':10},
}
df2 = pd.DataFrame(data) # 外层字典的key作为列 , 内层key作为行索引
df2 = pd.DataFrame(data , index = [\'user\',\'age\']) # 显式指出行索引
# 2. 二维数组
arr = [ [1,2,3,4] , [5,6,7,8] ]
pd.DataFrame(arr)
3、Series =》 DataFrame
pd.DataFrame(Series)
三、分组 GroupBy
df2 = pd.read_csv("G://..../pokemon.csv",encoding=\'gbk\')
g1 = df2.groupby([\'Type 1\' , ... ])
重要属性:
1.groups 返回dict {group name -> group labels} , 分组里每个组对应的索引项列表
重要方法:
1.first() 返回组中每一列的第一个值(非NaN)
2.size() 返回分组中类型的个数
3.describe() 生成各种汇总统计,不包括NaN值
4.get_group(\'xxx\') 获取该分组下所有项内容
Aggregation:
# 方式一 :
g1.sum()
# 方式二 :
import numpy as np
g1.agg(np.sum)
# 方式三 :
g1.agg(np.sum)[\' 列名 \'] # 单独计算某一列
g1[\' 列名 \'].agg(np.sum)
# 多重计算 :
g1.agg([ np.sum,np.mean,np.std,... ])
# 每一列 都使用不同统计量 (字典)
g1.agg( {"HP":[np.sum,np.mean],"Attack":np.std} )
# 重新命名返回的列
xxxx.rename(columns = {"HP":\'aaa\',"Attack":"bb"})
Transformation :
-
Transform返回发数据集与原数据集大小一样
-
每一个函数都是对每一个group进行的操作,不是全部的数据集
-
不会改变原有group的数据,返回的是新数据
-
每个函数是作用在每个group里面的column上
f = lambda s : ( s - s.mean() ) / s.std g1.transform( f ) # transform 计算非字符型变量
Filtration :
-
作用于整个group上 或者 作用于某个列
-
返回DataFrame
df = g1.filter(lambda s : len(s) >= 80 ) # 分组内项总数大于80 df = g1.filter(lambda s : np.mean(s[\'HP\']) >= 60 ) # 分组中HP平均值大于60