pandas
- 与 SQL 或 Excel 表类似的,含异构列的表格数据;
- 有序和无序(非固定频率)的时间序列数据;
- 带行列标签的矩阵数据,包括同构或异构型数据;
- 任意其它形式的观测、统计数据集, 数据转入 Pandas 数据结构时不必事先标记。
- 不改变原始的输入数据,而是复制数据,生成新的对象。
- 主要数据结构是 Series(一维数据)与 DataFrame(二维数据)
一、数据的基本操作
import pandas as pd
import numpy as np
print('pands对象的创建')
print('*'*100)
# Series对象本质上由两个数组构成,一个数组构成的键(index),一个数组构成的值(value)
arrs_a = pd.Series(np.arange(10),index=range(10))
print('arrs_a\n',arrs_a)
print('arrs_a的键(index)\n',arrs_a.index)
print('arrs_a的值(values)\n',arrs_a.values)
# 取值的方式 arrs_a[0:] arrs_a[1],arrs_a[[0,1]]
# DataFrame对象既有行索引又有列索引
# 行索引,表明不同行,横向索引,叫index,0轴,axis=0
# 列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
# arrs_aa = pd.DataFrame(np.arange(9).reshape((3,3)),index=list('ABC'),columns=list('abc'))
dict_aa = {"name":['a','b'],'age':[12,13]}
arrs_aa = pd.DataFrame(dict_aa)
print('arrs_aa\n',arrs_aa)
# 查看总体数据的情况 info()
# arrs_aa.info()
# 取值方式
# head()默认是获取5行
print('获取前两行\n',arrs_aa.head(2))
# arrs_aa[] 可以选择单列,可以切片多行
print('获取单列\n',arrs_aa['name'])
print('获取多行\n',arrs_aa[0:3])
# 按标签选择 loc[[],[]] loc[0:,0:] loc[(),()] 第一个表示获取的行切片行名,第二表示获取的列切片列名
print(arrs_aa.loc[[0],['age','name']]) # 0 表示的是index不是下标位置
print(arrs_aa.loc[0:,('age','name')]) # 0 表示的是index不是下标位置
# 按位置选择 iloc[[],[]] iloc[0:,0:] iloc[(),()] 第一个表示获取的行切片位置,第二表示获取的列切片位置
print(arrs_aa.iloc[0:,1]) # 表示的下标位置
# 布尔索引
print(arrs_aa[arrs_aa.age > 12])
二、数据清洗
# data_csv.info()
# 数据的去重值
# subset : column label or sequence of labels, optional
# 用来指定特定的列,默认所有列
# keep : {‘first’, ‘last’, False}, default ‘first’
# 删除重复项并保留第一次出现的项
# inplace : boolean, default False
# 是直接在原来数据上修改还是保留一个副本
data_csv.drop_duplicates(inplace=True)
# 数据的规范化
# 将列表中的浮点数,减小精度对数据处理的干扰,故对数值进行标准化操作,保留五位小数;
data_csv["销售金额"] = data_csv["销售金额"].round(decimals=5)
# 将日期转化为datetime类型,将非法日期至空,最后使用去空值操作去除
data_csv["销售日期"] = pd.to_datetime(data_csv["销售日期"],format='%Y%m%d',errors='coerce')
# 数据的去空值
# how = 'any' 即去除所有的空值 axis=0,按行去除
data_csv = data_csv.dropna(axis=0,how='any')
三、Pandas的eval()与query()函数
eval()相当于增删改操作
import pandas as pd
import numpy as np
df_01 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=list('abc'))
df_02 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=list('abc'))
# 对于DataFrame对象的操作
# 支持算术运算、比较运算、Bitwise运算
rt_01 = df_01 + df_01
rt_02 = pd.eval('df_01 + df_02')
# 对于DataFrame对象属性和索引的操作
data = df_01.eval('d = a +b')
data = df_02.eval('d = a[1] + b[2]')
# eval()中引用 local变量
column_mean = df_01.mean(1)
df_01['a'] + column_mean
df_01.eval('a + @column_mean')
query()相当于查询
# 根据每一列的值比较来筛选出合适的值
df[(df.a < 3) & (df.b < 4)]
df.query('a < 3 and b < 4')
# 引用local变量
# mean(0) 对每一列取均值 mean 对每一行取均值
column_mean = df.mean(1)
print(df[(df.a > column_mean) & (df.b > column_mean)])
print(df.query('a > @column_mean & b > @column_mean'))
实际使用中,传统方法和eval/query相差不是很明显,传统方法在较小的array上更快一些
使用eval/query的好处,主要是节省内存以及有时他们具有更简洁的语法形式