Pandas
Pandas
0 重要概念
pandas 核心对象就是Dataframe和Series,前者简称df,就是excel那样的数据,二维的。Series就是excel的一列,df由多个Series构成。
1.文件读取
df=pd.read_csv(file_path,sep=',',header,names,index_col,usecols,)
常用参数:file_path 就是路径
sep 默认为,
header 头 类似于excel的第一行
names 当header=None,可以设置头,['a','b','c']
index_col 有时候文件自带行索引,不需pandas提供
usecols 需要用到的那些列,['a','c']
skiprows 跳过哪一行,舍弃掉
# 其他文件格式大差不差
我们也可以使用 to_csv() 方法将 DataFrame 存储为 csv 文件
1.1 查看df的一般信息
df.head(n) # n为int 表示读前几行
df.tail(n) # 表示读后几行
df.info() # 查看数据的属性 有没有缺失值
2.Series
2.0 Series简介
Series 就是可以理解为dataframe的一列,他的索引是可以设置的,可以理解为key:value
2.1 Series 创建
pd.Series(data:数据,index:"索引",dtype:"类型",name:"名称")
s1 = pd.Series(data=[i for i in range(10)], index=[f'{i}a' for i in range(10)])
print(s1['1a']) # 为 1 可以根据索引直接取出来
data 也可以是字典
data = {f'{i}a':i for i in range(10)} # 和上面是样的
2.2 Series 属性
series.index # 系列的索引
series.values # 系列的值
series.name # 头标签,类似于excel的第一行
series.hasnan # 是否有nan值
2.3 Series 数据访问
s1 = Pd.Series(data={f'{i}a':i for i in range(10)})
s1[0],s1[[1,2,3]],s1[1:3], # 内置索引
s1[['1a','2a']] # 我们自己设置的索引
2.4 Series 部分函数使用
series.astype(dtype) # 将series类型转成dtype dataframe df.astype({"col":dtype})
series.convert_dtypes() # 自动转成便于计算的类型
series.apply(func) # 每一行应用方法
series.map({k:v}) # 把k映射成v,没有映射到的为NAN
series.agg(['min','max'])
series.groupby()
# ser.groupby(["a", "b", "a", "b"]).mean()
# ser.groupby(level=0).mean()
# ser.groupby(ser > 100).mean()
series.describe() # 描述信息
3 . Dataframe
3.1 Dataframe创建
1. 列表创建
pd.Dataframe([['Google',10],['Runoob',12],['Wiki',13]])
2. 字典创建1
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
pd.Dataframe(data = data)
3. 字典创建2
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
pd.Dataframe(data = data)
3.2 Dataframe 属性
df.index
df.columns
df.values # [ [一行行数据],[一行行数据] ]
df.memory_usage() # 内存使用信息
df.ndim # 几个维度的
3.3 Dataframe 转换
1. df.astype
df.astype('int32')
df.astype({'col1': 'int32'}).dtypes
2. convert_dtypes # 将python 对象转成 便于运算的
3. df.infer_objects()
3.4 行列操作curd等
3.4.1 列操作
1. 列的获取
df['列名']
df[['col1','col2']] # 取出想要的列 df[df.columns[0:2]] 这种也行
2. 列的添加
df['新列'] = pd.Series([xxxx,xxxxx])
3. 插入
df.insert(2,'列名',allow_duplicates=False) # 第三个参数表示可不可以列名重复
4. 删除
del(df['列名'])
df.pop('列名')
df.drop(['列名'],axis=1) # 当axis=1 删除列 当为0 时表示删除一行
3.4.2 行操作
1 . 取出
df.loc[['b','d']]
df.iloc[0:2]
df.loc['a':'b',"a":"e"] # 自定义索引切
df.iloc[1:3,2:5] # 自带int索引获取
2. 添加
df.append(df,ignore_index) #
3. 删除
df.drop(index)
4. 定位
df['列']['索引'] # 视图 可以修改
df['列'].iat[index]
3.5 Dataframe 一些方法
1. df.where(df>100,other=100) #大于100的保持原样,其他的为100
2. df.mask(df>100,1000) # 大于100 的标记为1000
3. df.query('a<b') # 返回dataframe对象 和这个一样 df[df.a < df.b]
4. df.apply(func,axis) axis=0 表示一列下都是的,axis=1表示 每一行
5. df.applymap(func) 给每一个元素,进行函数处理
6. df.groupby(['列']).agg({'age':[np.min,np.max]})
7. df.sort_values(by, axis=0, ascending=True:"升序还是降序",inplace = False:"是否就地")
ex:
df2 = pd.DataFrame({"a":['v1a','a3e',"o2q",'o4w'],'b':[ i for i in range(4)]})
df2.sort_values(by='a',key = lambda x:df2['a'].apply(lambda x:int(x[1])))
8. df.set_index('col') #把列作为索引
3.6 数据透视表
3.6.0 透视表简介
和excel的透视表一样,将一堆数据,按照某一列分组,计算出其他列的均值、总和、最大值等类似的值
3.6.1 pivot_table的使用
pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)
values # 要计算那种数据
index # 指的是一行一行的索引,
columns # 指的是每一个列的索引
margins # 表示是否有边缘 汇总,
3.7 数据清洗
数据一般会存在重复值,异常值,缺失值
重复值:数据重复,可能是一行数据都一样当作为重复,也可能事某一列重复就当作重复。
缺失值:值没有,一般要填充,填充的值有多样,众数、平均等
异常值:有一些值比较怪,不符合标准。比如某个值大于三倍标准差的测定值
3.7.1 重复值
df.duplicated(subset=['列'],keep='last') # subset 默认每一行都一样才算重复,keep表示重复的值保留哪一个,最后一个还是第一个
df.drop_duplicated(subset=['列'],keep='last') # 去除重复值,subset表示哪列一样就算重复
3.7.2 缺失值
1. 丢弃 df.dropna( axis = 0 , how = 'any' , thresh = None , subset = None , inplace = False )
thresf: 表示要有几个缺失才删除
axis: 表示轴
subset: 表示依据那几个列判断,
inplace:表示是否修改原来的df
2. 替换 df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
method:表示替换的方法
limit:表示最多替换多少
value:表示把nan替换成什么
3. 插值法
通过计算构建模型计算出这个值
3.7.3 异常值
异常值一般要通过分析,根据业务场景标准不一样,有常见几种方法,
1. 简单统计量分析
2. 3σ原则,数据 - 平均值 > 3*标准差
3. 箱线图分析方法
3.8 Dataframe 合并
3.8.1 df.append()
df.append(other, ignore_index=False, verify_integrity=False, sort=False)
other: 添加其他的df,数据一样
3.8.2 df.compare()
df.compare(other, align_axis=1, keep_shape=False, keep_equal=False)
# 展示两个df的不同,
3.8.3 df.join()
df.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
other:表示和谁合并
on:以那个为准合并
lsuffix:当df的列一样左边的df的列加一个后缀
3.8.4 df.merge()
df.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
永远不要高估自己