公众号:uncle39py

V1

2022/01/17阅读:51主题:默认主题

Pandas

Pandas的作用:

  • 读取数据(比如读excel表)
  • 数据概览(查看行列等情况)
  • 数据提取(取出关注的数据)
  • 数据处理(剔除重复值缺失值等)

一、读取数据

比较常见的本地数据有txt,csv,xls,xlsx。

1、数据读取进python后是一个DataFrame对象。

2、读取数据的官方文档(官网document)

3、pd.read_csv()可以用来读取csv和txt的文件。

# 函数参数非常多,说明存在非常多导入的情形,我把常用的加上注释:
pd.read_csv(
    filepath_or_buffer, # 文件路径,可以用r''来转义;目录斜杠:/
    sep=<no_default>,  #  文档中各数据之间的分隔符
    header='infer',  # 表头,默认会将文档首行作为表头(也就是列名)如果无表头可以设置head=none
    names=<no_default>, # 如果head=none,可以通过names为各个列设置列名,names=['','']
    comment=None,  # 指定注释符,读取数据时遇到行首有注释符的则跳过此行
    engine=None,  # engine=python
    converters=None# 通过字典,为文档中的某些列指定数据类型,比如编号列是0开头的 指定为str后就不会丢失前面的0
    skiprows=None,  # 忽略前面几行
    skipfooter=0,  #  忽略末尾几行
    skip_blank_lines=True,  # 跳过空行
    index_col=None,
    usecols=None,
    squeeze=False,
    prefix=<no_default>,
    mangle_dupe_cols=True,
    dtype: 'DtypeArg | None' = None,
    true_values=None,
    false_values=None,
    skipinitialspace=False,
    nrows=None,
    na_values=None,
    keep_default_na=True,
    na_filter=True,
    verbose=False,
    parse_dates=False,
    infer_datetime_format=False,
    keep_date_col=False,
    date_parser=None,
    dayfirst=False,
    cache_dates=True,
    iterator=False,
    chunksize=None,
    compression='infer',
    thousands=None,
    decimal: 'str' = '.',
    lineterminator=None,
    quotechar='"',
    quoting=0,
    doublequote=True,
    delimiter=None,
    escapechar=None,
    encoding=None,
    encoding_errors: 'str | None' = 'strict',
    dialect=None,
    error_bad_lines=None,
    warn_bad_lines=None,
    on_bad_lines=None,
    delim_whitespace=False,
    low_memory=True,
    memory_map=False,
    float_precision=None,
    storage_options: 'StorageOptions' = None,
)

4、pd.read_excel()可以用来读取xls,xlsx的文档。参数与上面相似。

pd.read_excel(
    io,  # 文件路径
    sheet_name=0,  # 指定excel中的sheet,可以是名字,也可以是索引
    header=0,
    names=None,
    index_col=None,
    usecols=None,
    squeeze=False,
    dtype: 'DtypeArg | None' = None,
    engine=None,
    converters=None,
    true_values=None,
    false_values=None,
    skiprows=None,
    nrows=None,
    na_values=None,
    keep_default_na=True,
    na_filter=True,
    verbose=False,
    parse_dates=False,
    date_parser=None,
    thousands=None,
    comment=None,
    skipfooter=0,
    convert_float=None,
    mangle_dupe_cols=True,
    storage_options: 'StorageOptions' = None,
)

二、数据概览

df=pd.read_csv(r'data/行业指数pe_ttm.CSV',encoding='GBK')
df.head(10)
df.tail(6)
#1、查看导入的数据的头10行与尾6行,目的是看导入是否符合预期

df.shape
#2、查看数据的规模,返回(1862, 11)即:多少行多少列

df.index #3、查看数据的行索引
df.columns #3、查看数据的列索引(列名)
df.dtypes #4、返回每一列的数据类型(有s)

df.info()  #注意:是函数,有括号
#5、查看数据的整体信息,包含的信息很多,有行列的情况,占用内存大小的情况,非空的情况,数据类型的情况

df.describe() #注意:是函数,有括号
#6、对数值类型进行简单的描述性统计,有最小值、最大值、平均值等等

df.isnull()  # 7、查看缺失值情况,会对表格每一个值进行判断,返回True/False。数据量大的时候无法一目了然,所以用下面的方法
df.isnull().sum() #8、对缺失值进行统计,统计出每一个字段有多少缺失值。
df.isnull().sum(axis=1#对行的缺失值进行统计。

df.duplicated()
df.duplicated().sum()  #9、查看重复值的情况
三、数据提取(loc、iloc提取区域数据的两种方式)

pandas中有两种数据类型:DataFrame、Series。

对DataFrame对象提取出单独的一列,这一列就是Series类型。Series类型的数据包含索引和及其对应的值。提取出一行后,数据也是列索引及其对应的值,所以也是Series类型。

df['列名']  #10、提取出DataFrame对象的某一列,是Series类型

df[80:100]  #11、提取80到100行(左闭右开),返回结果是一个新的DataFrame对象

df.loc[20:30,['全指能源','全指材料']]
#12、提取20到30行,全指能源,全指材料这两列。
#提取的是一块区域,注意loc后面是列表套列表。loc[[行索引],[列索引]]
#这里我翻看底层原码,loc是一个函数,怎么能这么传参?有懂的人教我一下

df1 = df.set_index('时间'#13、将某一列设置为行索引,原df不变,返回一个新的对象
df1.columns # 查看列索引
df1.index # 查看行索引
df1.loc[['2019/3/29''2019/3/28''2019/3/27''2019/3/26'],['全指能源''全指材料','全指消费']
df1.loc[:,:]  # 提取出全部行和全部列(支持切片)

#14、loc支持布尔索引,可以把某一列中符合要求的行列提取出来
df1.loc[df1['全指公用']<20,:] 
#列表内第一个代表行:这个行里面满足['全指公用']<20这个条件的所有行。
#第二个代表列:切片(所有列)

#15、loc可以用于增加列
df.loc[:,'新列名']=[...] #对所有行增加一个"权重"列,用=右边的列表为其赋值
#16、iloc基于位置的提取,i代表int(全是整数)
df.iloc[1:10,2:4#提取1到10行,2到4列的这一块
#全部基于位置,即使有索引也只能用位置。
df.iloc[1:10,[1,4,7]] # 如果列不连在一起,可以用列表
df.sample(4#17、对df数据进行抽样,数字代表抽几行

df.sample(
    n=None,  # 抽样数量
    frac: 'float | None' = None#按比例抽样,填一个小数
    replace: 'bool_t' = False#是否允许抽样数量大于样本数量,即:是否是有放回抽样(了解即可)
    weights=None# 抽样权重,需要一个权重列,权重和归一化后进行采样
    random_state=None,
    axis: 'Axis | None' = None# 0和1,对行或列进行抽样
    ignore_index: 'bool_t' = False,
)
四、数据处理

对数据进行类型转换等处理:

df4= df.copy() #18 复制一份数据,保护原数据

df4['新列']=df4['权重'].astype(str) #19、更改某一列的数据类型。也可以重新赋值给原先的列

df4['金额']=df4['金额'].str.strip('$').astype(float)
#20、将$1这样的金额数据由object转成数字。注意上面有个.str

df['时间']=pd.to_datetime(df['时间'],format='%Y/%m/%d')
#21、将object类型的时间转成datetime64类型的时间。'%Y/%m/%d'表示原字符串中的时间格式

对重复值的处理:

df.duplicated().sum() # 查重复值个数,df中两行每一个值都相等才是重复行
df.drop_duplicates()  #删除重复行

df4.drop_duplicates(
    inplace: 'bool' = False# True为替换掉原df,False为不改变原df而是新返回一个
    ignore_index: 'bool' = False#True为重新排索引值,否则只删除重复行但索引不改变
)

对异常值(比如年龄大于200)的处理:

df.describe() 
#6、对数值类型进行简单的描述性统计,有最小值、最大值、平均值等等。
df.describe([0.25,0.99])
# 参数可以给一个列表,把最小值最大值中间的第四分一、第99%的数值显示出来。常用于查看异常值。

df1.loc[df1['age']>200,:]
df1.drop(index=118,inplace=True)
#14、loc支持布尔索引,可以把某一列中符合要求的行列提取出来(有索引值),然后用drop()方法来指定索引删除
#如果异常值很多,索引就很多,一个个指定索引删除就繁琐,可以用这种方式:
df1=df1.loc[~(df1['age']>200),:] # ~代表取反

对缺失值的处理:

df.isnull().sum() #8、对缺失值进行统计,统计出每一个字段有多少缺失值。
# 光看缺失值数量 却不对比总样本数是不对的。
df.isnull().mean() # 可以查看各列缺失值的比例

df.drop(columns='xx',inplace=True#删除缺失值大于某个比例的列

df=df.loc[:,df.isnull().mean()<0.5#剔除缺失值比例大于50%的列

df.dropna() #删除所有缺失值所在的行和列,像炸弹一样横纵两列都消失

df.fillna() # 填充缺失值。
df['age'].fillna(df['age'].mean())  # 用均值填充
df['age'].fillna(method='bfill')  # 用此空后面的值填充
df['age'].fillna(method='ffill')  # 用此空前面的值填充,有顺序的序列可以此二法填充

关注公众号:uncle39py

分类:

后端

标签:

Python

作者介绍

公众号:uncle39py
V1