【语言学习】python常用包 pandas - hippowc/hippowc.github.io GitHub Wiki

常用库介绍

概览

  • scikit-learn: 机器学习工具
    • sciPy: 科学和工程领域软件包,包括统计、线代、傅里叶变换等求解
      • numpy: 存储和处理大型矩阵
    • matplotlib: 2D绘图库,用于数据可视化
  • pandas: 数据分析环境,常用于金融数据分析工具
    • numpy: 存储和处理大型矩阵

pandas

pandas是开源数据处理库,基于numpy开发,可以看做一个数据容器,可以储存整数、浮点数、字符串等类型的数据

数据类型

  • Series(一维数组)
pandas.Series(data=dic/arr, index=arr)

可以把Series理解为字典,带有index的一个数组

  • DataFrame(二维数组)
pandas.DataFrame(data=二维数组, index=arr, columns=arr)
  • data 可以看做表,每个数组是一行
  • index 代表行索引
  • columns 代表列索引 Series 和 DataFrame 应用的最为广泛,几乎占据了使用频率 90% 以上,其中DataFrame应用最多,后续相关操作主要以DataFrame为主

输入与输出

可以支持从各种内容中读取以及输出

  • read_pickle 从对象中读取
  • read_table 通用的分隔文件
  • read_csv 从csv文件
  • read_json 从json文件
  • read_excel 从excel
  • read_sql 从sql中

比较常用的是read_csv,以csv的读写为例:

pandas.read_csv('file_path', sep=',', header=0, index_col=None, dtype=object)

读文件需要注意的几个参数

  • file_path: 文件路径
  • sep: 分隔符
  • header=0: 指定第一行为列名,默认'infer',也可以None,则自动生成列名
  • index_col=None: 指定行索引,默认为None,0表示第一列为索引
  • dtype: 指定单元格的文本类型,object 对应 转为python的 str,还可以为int64 float64 bool,一般可以统一转为string然后在进一步处理

csv的写方法:

DataFrame.to_csv('file_path', sep=',', header=True, index=True)
# 为了解决很多表格内有逗号等常用分隔符,分隔符可以采用不可见字符
sep='\u0001'
  • file_path: 文件路径
  • sep: 分隔符,默认为,
  • header: 是否写列名
  • index: 是否写索引

DataFrame 数据选择

一般有三种方式选择DataFrame的数据: 使用[], 使用iloc[], 使用loc[]

  • [] 行与列选择
data['w']  #选择表格中的'w'列,使用类字典属性,返回的是Series类型
data.w    #选择表格中的'w'列,使用点属性,返回的是Series类型
data['w'](/hippowc/hippowc.github.io/wiki/'w')  #选择表格中的'w'列,返回的是DataFrame属性
data['w','z'](/hippowc/hippowc.github.io/wiki/'w','z')  #选择表格中的'w'、'z'列
data[0:2]  #返回第1行到第2行的所有行,前闭后开,包括前不包括后
data[1:2]  #返回第2行,从0计,返回的是单行,通过有前后值的索引形式,#如果采用data[1]则报错
data.ix[1:2] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同
  • 基于索引选择
df.iloc[行], [列](/hippowc/hippowc.github.io/wiki/行],-[列)
df.iloc[:3] # 选取前3行
df.iloc[1, 3, 5](/hippowc/hippowc.github.io/wiki/1,-3,-5) # 选取1、3、5行
df.iloc[:, 1:4] # 选取2-4列
  • 基于标签名称选择
df.loc[:, 'Total Population':'Total Males']
  • 选择单元格
df.iat[1,1] 返回单元格内容

DataFrame 数据过滤

pandas表达式以及[]过滤
  • pandas的数据类型Series、DataFrame支持各种比较操作,并且重载了操作符
    • df > 1 返回DataFrame格式的boolean值
    • df['A'] > 1 返回Series格式的boolean值
  • DataFrame可以使用[] 过滤数据,选取其中为True的行或者单元格
    • df[df['A'] > 1] 选取A列所有大于1的行
    • df[df['E'].isin(['one'])] 选取E列中在['one']数组中的行
  • 使用 | & 多条件组合,组合之间记得加括号
    • df[(df['a'] == 1) | (df['b'] != 2)]
  • NAN 不能使用 == ,使用is 比较,或者替换为‘’空字符串 df.fillna('')
常用过滤方法
  • 去除空行
## Series
xx.dropna()
## DataFrame
data.dropna    # 默认滤除所有包含NaN的行
data.dropna(how = 'all')    # 传入这个参数后将只丢弃全为缺失值的那些行
data.dropna(axis = 1)       # 丢弃有缺失值的列(一般不会这么做,这样会删掉一个特征)axis = 0 表示行,1表示列
data.dropna(axis=1,how="all")   # 丢弃全为缺失值的那些列
data.dropna(axis=0,subset = ["Age", "Sex"])   # 丢弃‘Age’和‘Sex’这两列中有缺失值的行  
  • 去重
drop_duplicates(subset=' 列名',keep='firsrt',inplace='True')函数是删除DataFrame的某列中重复项的函数
df.drop_duplicates(subset=['y','z'],keep='first',inplace=True)
# subset输入列名
# keep包括'first','last',False,三个参数,注意first和last带引号
# inplace True保留重复,False不保留重复
  • 查看重复行
df[df.duplicated(subset=['name'],keep=False)]
  • 排序
df.sort_values('name')

DataFrame 数据合并与删除

  • merge
    • 类似与sql中的join操作,使用一个或多个键把多行数据结合到一起
    • 基于某个列进行连接 on, left_on, right_on
    • 连接方案 right, left, outer

'''

不指定按哪一列合并,使用相同列,进行inner连接

pd.merge(df1, df2)

通过on 指定基于哪一列进行合并,两个列名相同

pd.merge(df1, df2, on='col')

两个基准列名称不同时

pd.merge(df1, df2, left_on='c1', right_on='c2')

指定连接方式

pd.merge(df1, df2, how='right') '''

  • concat
    • 连接两个df
pd.concat([df1, df2], ignore_index=True)
  • drop
    • DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
    • 两种方式
      • labels=none, axis=0
      • index 或 columns 指定

DataFrame 数据修改

  • map
    • map() 是python自带的函数,能直接对序列元素的操作,所以必须对DataFrame的某列 (只针对于列) 应用操作
  • apply
    • apply()是pandas里DataFrame的函数,可以针对DataFrame中的行数据或列数据应用操作。
    • DataFrame.apply(func, axis=1, broadcast=False, raw=False, reduce=None, args=(), **kwds)
    • axis的概念,在DataFrame对象的大多数方法中,都会有axis这个参数,它控制了你指定的操作是沿着0轴还是1轴进行,axis=0代表操作对列columns进行,axis=1代表操作对行row进行
    • apply默认参数是行或列,通过axis指定
    • 用户apply的函数,第一个参数默认会传入series
  • applymap
    • applymap()是pandas里DataFrame的函数,但是它对DataFrame中所有的元素应用操作。
    • df = df.applymap(lambda x:"%.2f" % x)
SettingWithCopyWarning问题

当使用这种方式进行赋值时:

df.loc[df['A'] > 2, 'B'] = new_val

无法赋值成功,可以这样:

df = df[df['A'] > 2]
df['B'] = new_val

DataFrame 数据迭代

  • iterrows(): 按行遍历,将DataFrame的每一行迭代为(index, Series)对,可以通过row[name]对元素进行访问。
  • itertuples(): 按行遍历,将DataFrame的每一行迭代为元祖,可以通过row[name]对元素进行访问,比iterrows()效率高。
  • iteritems():按列遍历,将DataFrame的每一列迭代为(列名, Series)对,可以通过row[index]对元素进行访问。

DataFrame 分组 groupby

通过groupby(['col'])可以按照某列进行分组,返回值为GroupDataFrame对象,可迭代,返回列名和对应的dataFrame,狠方便