pandas 基础属性

pandas.series自带了三个’’属性”,管理分类的cat,管理字符串的str,管理时间的dt

str

  • pd.series.str:返回的是一个series的字符串列,但是复杂函数还是要apply写。
  • pd.series.str.contain(str):查找列是否包含该str,包含则返回行。
  • pd.series.str.len():返回该series列所有str的长度。

dt

首先要把格式转为datatime格式

pd.to_datetime(“series”)

  • pd.series.dt:返回的是一个series的datetime类型列,可以做datatime类型操作

  • pd.series.dt:有几个内置属性

    hour:返回datetime的时

    day: 返回datetime的天

    second:返回datetime的秒

    quarter:返回第几季度

    month:返回月

    year:返回年

datatime类型还可以进行加减操作哦

pandas 读写文件1

read_csv

读取txt | tsv*等类似类型文件也可以用,sep设置为空格 | \t 就行了

当然pandas的series也可以写入或读取

Pandas.read_csv(filepath_or_buffer,sep,header,dtype,engine,converters,skiprows,skipfooter,nrows)2

  • filepath::读取的文件地址或url地址

  • sep:str类型,默认’,’ 指定分隔符。如果不指定参数,则会尝试使用默认值逗号分隔。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号,并且可以用正则匹配!

  • header:指定第几行作为列名(忽略注解行),如果没有指定列名,默认header=0; 如果指定了列名header=None

  • dtype:例子: {‘a’: np.float64, ‘b’: np.int32} 指定每一列的数据类型,a,b表示列名

  • engine:使用的分析引擎。可以选择C或者是python,C引擎快但是Python引擎功能更多一些。并且如果sep本意不是正则可以用这个来区别

    比如:sep=’::’没有engine时会被识别为正则,本意是数据确实就是以::分隔的,用engine=python来区别

  • converters:置指定列的处理函数,可以用”序号”也可以使用“列名”进行列的指定

  • skiprows:默认值 None 需要忽略的行数即header的后xx行开始,,或需要跳过的行号列表(从0开始)

    如果是一个csv文件,excel打开默认header为第一行,要从第15行开始读取则设置skiprows=14,但这样header也会被跳过,所以一般是skiprows=[i for i in rang(1,14)]

  • skipfooters:从文件尾部开始忽略

  • nrows:从文件中只读取多少数据行,需要读取的行数(从文件头开始算起)

对应的是Dataframe.to_csv(),参数都类似,

# 设置index=None,写入时除去index,这样正常读入就没有unnamed了
df.to_csv(xxx,index=None)

写入txt

这个要提一下,因为很多人都会忽略to_csv的sep参数。

csv本质是:分割的txt文件,所以实质上pandas也兼容了写入txt

# 常用模板如下
# 只需声明分割符就行了
df.to_csv('path',sep='\t',header=None,index=None)

read_excel

Pandas.read_excel(io,sheet_name,sep,header,dtype,engine,converters,skiprows,skipfooter,nrows)

与read_csv参数基本相同,这里只介绍额外增加的参数

  • io:文件类对象 ,pandas Excel 文件或 xlrd 工作簿。该字符串可能是一个URL。URL包括http,ftp,s3和文件。例如,本地文件可写成file://localhost/path/to/workbook.xlsx
  • sheet_name:默认是sheetname为0,返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe,表名用字符串表示,索引表位置用整数表示;

read_json

Pandas.read_json(filepath_or_buffer,orient,header,type,dtype,convert_dates,keep_default_dates,numpy,encoding,lines)

  • orient:预期的json字符串格式,orient的设置有以下几个值:
    1. ‘split’ : dict like {index -> [index], columns -> [columns], data -> [values]}
    2. ‘records’ : list like [{column -> value}, … , {column -> value}]
    3. ‘index’ : dict like {index -> {column -> value}}
    4. ‘columns’ : dict like {column -> {index -> value}}
    5. ‘values’ : just the values array
  • type:返回的格式(series or frame), 默认是 ‘frame’
  • dtype:同csv,列的数据类型
  • convert_dates:解析日期的列列表;如果为True,则尝试解析类似日期的列,默认值为True
  • keep_default_dates:default True。如果解析日期,则解析默认的日期样列
  • numpy:直接解码为numpy数组。默认为False;仅支持数字数据,但标签可能是非数字的。
  • encoding:json编码
  • lines:将每行读取为一个json对象

read_html

Pandas.read_html(io,match,flavor,header,index_col,skiprows,attrs,parse_dates)

  • io:接收网址、文件、字符串。网址不接受https,尝试去掉s后爬去
  • match:正则表达式,返回与正则表达式匹配的表格
  • flavor:html解释器
  • index_col:同csv
  • skip_rows:同csv
  • attrs:属性,比如 attrs = {‘id’: ‘table’}不是很懂
  • parse_dates:解析日期

pandas查询数据

pandas.loc

无敌好吧,我只能说无敌

dataframe.iloc和loc相似,不过只能接受整数的传参。而loc可以接受整数,字符串,bool的传参(注意先行后列就行了)

缺点就是必须按照顺序索引(比如muti index 必须先level 1再索引level 2)

dataframe.loc

初始表格


tuples = [
('cobra', 'mark i'), ('cobra', 'mark ii'),
('sidewinder', 'mark i'), ('sidewinder', 'mark ii'),
('viper', 'mark ii'), ('viper', 'mark iii')
]
index = pd.MultiIndex.from_tuples(tuples)
values = [[12, 2], [0, 4], [10, 20],
[1, 4], [7, 1], [16, 36]]
df = pd.DataFrame(values, columns=['max_speed', 'shield'], index=index)
df

image-20210114195313389

数据提取

# 返回dataframe
df.loc[['viper'],:]

# 返回series
df.loc['viper',:]

# 间隔取(这样只能返回dataframe
# 不加[]会报错
df.loc[['cobra','viper'],:]
# 连续取值(只能返回dataframe)
# 行切片则是前闭后闭,列切片也是前闭后闭(不然怎么取全列
df.loc['cobra':'sidewinder','max_speed':'temp']

# 只有单列查询才会返回series否则其他的全是dataframe
# series
df.loc['cobra':'viper','shield']
# dataframe
df.loc['cobra':'sidewinder',['shield']]
df.loc[['cobra','viper'],'max_speed':'shield']

image-20210114200044927

bool类型传参

dataframe.loc[bool]和dataframe[bool]不一样!!!

dataframe.loc[bool]是遍历行,dataframe[bool]是遍历所有元素,但是当index是muti index时不能用index

# 列的bool值要带入新的loc的行部分
df.loc[df.loc[:,'shield']>30,:]
# 等效
df[df.shield>30]


# 行的bool值要带入新的loc的列部分
df.loc[('cobra','mark ii')]>3


df.loc[:,df.loc[('cobra','mark ii')]>3]

# 逻辑 判断
# |是or,&是and每个条件要括号括起
df.loc[:,(df.loc[('cobra','mark ii')]>3)&(df.loc[('cobra','mark ii')]<3)]
# isin([xx,xx]) 是否存在
# 通过~取反相当于!
df.loc[:,df.loc[('cobra','mark ii')].isin([3,4,5])]
df.loc[:,~(df.loc[('cobra','mark ii')].isin([3,4,5]))]
# serise.str.contain(xxx|xx|x)
# 不完全匹配字符串

image-20210114201447424

设置values

df.loc[['viper', 'sidewinder'], ['shield']] = 50

dataframe.xs()函数

pandas.DataFrame.xs(key,axis=0,level=None,drop_level=True) 4

  • key: 行index或列的name
  • axis: index或columns
  • level: 指定行的level等级

iter遍历

  • 遍历整行:Dataframe.iterrows():
  • 遍历全部列:Dataframe.iteritems():

pandas数据处理

nan的处理

dataframe.fillna()

DataFrame.fillna(value=None,method=None,axis=None,inplace=False, limit=None,downcast=None)

  • value:将nan填充为的value
  • method:填充方法bfill:向后寻找第一个非空进行填充, ffill:向前寻找第一个非空进行填充
  • axis:填充的坐标轴
  • inplace是否赋值到原dataframe

数据类型转换

# 读入转换
pd.read_csv('xxx',dtype={'columns_name':columns_type,'xxx':xx})
# 强制转换
df.column_name.astype(int)

dataframe.dropna()

DataFrame.dropna(axis=0, how=’any’,thresh=None, subset=None, inplace=False*)

  • axis:axis=0丢掉包含nan值的行,axis=1则为丢掉列
  • how:决定是是所有行或列包含nan丢弃(all)还是只有一个就丢弃(any)

dataframe.isnull()

pandas.isnull(obj)

判断obj类里面所有值是否为null,返回bool类型

pandas.drop

DataFrame.drop(labels=None,axis=0, index=None, columns=None,level=None,inplace=False, errors=’raise’

  • labels:字符串或数组,需要删去的对应关键字
  • axis:axis默认为0 ,即默认删除行
  • index:index=labels等价于labels=labels,axis=0
  • inplace:是否替换原数据

dataframe.reset_index()

dataframe.reset_index(level=None,drop=False,inplace=False,col_level=0,col_fill=’’)

  • level:从index 移除的level index,默认全部移除index重新标号
  • inplace:是否替换原数据
  • 如果列是muti columns 则选择插入到第几个level
  • col_fill:选择列插入时其他列的命名,默认repeat

dataframe.rename()

dataframe.rename(mapper=None,index=None,columns=None,axis=None,copy=True,inplace=False,level=None,errors=’ignore’)

  • mapper:函数或字典
  • index:如果axis=0 则mapper作用与index
  • columns:axis=1 mapper作用与columns
  • axis:指定坐标轴
  • inplace:是否替换原数据

该函数也能用在series上

pandas 数据统计

dataframe.info()函数

Dataframe.info(verbose=None,buf=None,max_col=None,memory_usage=None,null_counts=None)

  • verbose:是否返回全部信息
  • 是否输出到文件,默认输出到屏幕

dataframe.describe()函数

管他的,用默认参数就完事了

还有series.describe(),和这个类似

dataframe.value_counts()函数

Dataframe.value_counts(subset=None,normalize=False,sort=True,ascending=False,dropna=True)

  • subset: 需要计数的列
  • normalize:返回频数(False)还是比例(True)
  • sort:是否排序
  • ascending:是否降序排列(默认降序)
  • dropna:是否不统计na
  • 返回的是去重后对应的key和value

series.value_counts()和这个类似不过没有了subset而已。

但是奇怪的是用Dataframe会报错很神奇。

pandas 数据整理

concat

pandas.concat(objs=[],axis=0,join=outer,ignore_index=False)

  • opt:需要合并的series或dataframe
  • axis:合并的轴,1为列(横向拼接),0按为行(向下拼接)
  • join:合并的方式
  • ignore_index: 是否忽略index,如果忽略新的index将按0,1…编号

感觉这一个万能,merge只能两个合并,这个可以多个合并

merge

pandas.DataFrame.merge(left,right,how=’inner’, on=None, left_index=False,right_index=False,sort=False, validate=None)

  • left :dataframe
  • right: dataframe或者series (需要被merge的对象)
  • left_index: 新index用左边的
  • right_index: 新index用右边的
  • how: left, right, outer, inner, cross, 默认inner,
    • left:按左边关键字合并
    • right:按右边关键字合并
    • outer:取并集关键字合并,没有的关键字用na替代
    • inner:取交集关键字合并
    • cross: 笛卡尔积合并
  • sort:是否排序
  • validate:str,optional 对应关系

还有些append什么的就算了。

#df 1 
# a b
# 0 foo 1
# 1 bar 2
# df 2
# a c
# 0 foo 3
# 1 baz 4

df1.merge(df2, how='inner', on='a')
# a b c
# 0 foo 1 3

groupby

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True,observed=False, dropna=True)

  • by:通过什么group 可以是function,list,dic…
  • axis: 按行还是按列group,(通常是行
  • sort:是否按key值排序,默认排序
  • dropna:是否丢弃na值,默认丢弃
  • 返回的是一个dataframe!!!

当然series也有groupby,参数相同,只是返回的是一个series。

在pandas读取文件的过程中,最常出现的问题,就是中文问题与格式问题,希望当你碰到的时候,可以完美的解决。

apply

pd.DataFrame.apply(func,axis=0,raw=False,result_type=None,args=(),kwargs

  • axis:0|index 传入按每行,1|columns依次按每列值传入(通常是axis=1来用)

    #df
    A B
    0 4 9
    1 4 9
    2 4 9

    # axis=0 按行传入的值分别为
    [4,4,4],[9,9,9]

    # axis=1 按列传入的值分别为
    [4,9],[4,9],[4,9]
  • raw:False 代表传入函数为一个Series,True代表传入函数的是一个np.arrary

  • result_type:expand,reduce,broadcast,当axis=1才有效

进度条

虽然官网上搜索不到了,但还可以用

from tqdm import tqdm 
tqdm.pandas(desc='xxx')
# 与正常apply一样传参
data.progress_apply()

最后附上pyechart可视化官方文档,配合pandas使用3^

Reference

1. 本文因上次训练拉跨了,遂有感而发,pandas基础学习主要是看这个视频,顺便附上pandas官网链接
2. 读取文件参数基本参考了:https://www.cnblogs.com/happymeng/p/10481293.html
3. 上次训练又拉跨了,pyechart也该总结一下了…/(ㄒoㄒ)/~~
4. 索引部分参考