一些数据处理中常用的pandas的方法总结,欢迎指正和补充
# 二、pandas库
# Pandas数据结构有三种:Series、DataFrame和Panel。
# Series类似于一维数组;
# DataFrame是类似表格的二维数组;
# Panel可以视为Excel的多表单Sheet。
# Series:是一种一维数组对象,包含了一个值序列,并且包含了数据标签,称为索引(index),可通过索引来访问数组中的数据。
# 1、Series的创建
# 1.1、创建Series时指定索引
import numpy as np
import pandas as pd
index=["a","b","c"]
v=[1,2,3]
Series01=pd.Series(v,index=index,name="col")
print(Series01)
# 1.2、通过字典创建Series
data={'chinese':100,'english':99,'math':99}
se1=pd.Series(data)
print(se1)
# 尽管创建Series指定了index参数,实际Pandas还是有隐藏的index位置信息的。
# 所以Series有两套描述某条数据的手段:位置和标签
# 2、DataFrame的创建
# DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。
# DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
# 2.1、字典创建DataFrame
# 最常见的是直接传入一个由等长列表或NumPy数组组成的字典来形成DataFrame。
data={
'name':['liuyusong','liusen','wuweijie','luanwenbo','zhnagshuaixu','liuchengxi'],
'sex':['男','男','男','男','男','男'],
'year':[21,21,22,20,22,21]
}
ind=[1,2,3,4,5,6]
df1=pd.DataFrame(data,index=ind)
print(df1)
# 2.2、DataFrame的索引
# DataFrame构造函数的columns函数给出列的名字,index给出label标签
columns=['name','sex','year']
index=['a','b','c','d','e','f']
df2=pd.DataFrame(data,columns=columns,index=index)
print(df2)
# 3、DataFrame数据的查询
# 选取通过DataFrame提供的head和tail方法可以得到多行数据,但是用这两种方法得到的数据都是从开始或者末尾获取连续的数据, 而利用sample可以随机抽取数据并显示。
# head() #默认获取前5行
# head(n)#获取前n行
# tail()#默认获取后5行
# head(n)#获取后n行
# sample(n)#随机抽取n行显示
# 3.1、head() #默认获取前5行
df2.head(5)
# 3.2、sample() #随机抽取n行显示
df2.sample(2)
# 选取行和列
# DataFrame.loc(行索引名称或条件,列索引名称)
# DataFrame.iloc(行索引位置,列索引位置)
# 3.3、loc选取行
display=df2.loc[['a'],['name']]
print(display)
# 3.4、iloc选取行
display=df2.iloc[[0],[0]]
print(display)
# 选取某一列的数据-直接通过列名索引
data_age=df2['sex']
print(data_age)
# 3.5、布尔选择
# 对DataFrame中的数据进行布尔方式选择,常用的布尔运算符为不等于(!=)、与(&)、或(|)。
# 3.5.1 布尔索引
bool_charge=df1[df1.year>20]
print(bool_charge)
# 4、DataFrame数据的编辑
# 4.1 增加数据
# 增加一行直接通过append方法传入字典结构数据即可。
add01={'name':'李四','sex':'女','year':18}
bool_charge=bool_charge.append(add01,ignore_index=True)
print(bool_charge)
#直接通过索引增加一列数据
bool_charge['add']=[1,2,3,4,5,6]
print(bool_charge)
# 4.2 删除数据
# 删除数据直接用drop方法,通过axis参数确定是删除的是行还是列。
# 默认数据删除不修改原数据,需要在原数据删除行列需要设置参数inplace = True。
# 删除数据的列_axis=1
delete01=bool_charge.drop('year',axis=1)
print(delete01)
# 删除数据的行_axis=0,原数据改变
delete02=bool_charge.drop(0,axis=0,inplace=True)
print(delete02)
# 4.3 修改数据
# 修改数据时直接对选择的数据赋值即可。
# 需要注意的是,数据修改是直接对DataFrame数据修改,操作无法撤销,因此更改数据时要做好数据备份。
# delete02.replace('男','女')
# print(delete02)
# 4.4 数据描述与统计
# 利用describe方法会对每个数值型的列数据进行统计
df1.describe()
# 5、数据分组与聚合
# 分组的两种方法
dec={'水果':['苹果','香蕉','橘子','香蕉'],'颜色':['红色','黄色','黄色','蓝色'],'价钱':[8.5,6.3,5.6,3.4]}
df=pd.DataFrame(dec)
print(df)
group01=df.groupby(by='颜色')
print(group01)
for i,j in group01:
print(i)
print("=========")
print(j)
group01['价钱'].mean()
# 等价于:
df['价钱'].groupby(df['水果']).mean()
# 6、pandas数据载入与预处理
# 6.1 通过csv库进行数据读取
# import csv
# with open('../data/iris.csv', 'r') as f:
# data=csv.reader(f)
# for row in data:
# print(row)
# 6.2 通过pandas库读取为DataFrame数据
data_pandas=pd.read_csv('../data/iris.csv')
print(data_pandas)
# print(data_pandas['Sepal.Length'])
# data_pandas=pd.read_excel('../data/tips.xls')
# print(data_pandas['tip'])
# print(data_pandas)
#sep指定分割符
# d1=pd.read_table('../data/iris.csv',sep=",")
# print(d1)
# 7、缺失值检测与处理
# 7.1 使用isnull检测缺失值
# Python内置的None值也会被当作NaN值处理。
# series1=pd.Series([1,2,3,np.nan,5])
# series1.isnull().sum()
data_isnull=data_pandas.isnull()
data_isnull_sum=data_pandas.isnull().sum()
print(data_isnull)
print(data_isnull_sum)
# 7.2 检测与处理缺失值
# 7.2.1 通过dropna方法可以删除具有缺失值的行。
series1=pd.Series([1,2,3,np.nan,5])
print(series1)
df3=pd.DataFrame(series1,columns=['list1'])
print(df3)
print(df3.isnull().sum())
df3=df3.dropna()
print(df3)
# dropna(axis=0, how=‘any)
# axis:确定过滤的行或列,取值可以为0或index:删除包含缺失值的行,默认为0。1或columns:删除包含缺失值的列。
# how:确定过滤的标准。any:默认值,如果存在NaN值,就删除该行或该列。 all:如果所有值都是NaN值,就删除该行或该列
# 7.2.2 填充缺失值
# Pandas库中提供了缺失值替换的方法fillna,格式如下:
# DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None)
# 通过字典形式填充缺失值
df_null=pd.DataFrame(np.random.rand(5,3))
print(df_null)
df_null.iloc[:3,1]=np.nan
df_null.iloc[:2,2]=np.nan
print(df_null)
print("----------")
print(df_null.fillna({1:0.88,2:0.66}))
print(df_null)
# 7.3 检测与处理重复值
# 在DataFrame中利用duplicates方法判断各行是否有重复数据。duplicates方法返回一个布尔值的series,反映每一行是否与之前的行重复。
# Pandas通过drop_duplicates删除重复的行,格式为:
# drop_duplicates(self, subset=None, keep=’first’, inplace=False)
# 7.3.1 判断DataFrame中的重复数据
data=pd.DataFrame({'l1':['one','two']*3+['two'],'k2':[1,1,1,1,2,2,3],'k3':[2,2,2,2,3,4,3]})
print(data)
print(data.duplicated())
# 每行各个字段都相同时去重
data=data.drop_duplicates()
print(data)
# 8、检测异常值
# 简单的数据统计方法中常用散点图、箱线图和3σ法则检测异常值。
# 散点图方法: 通过数据分布的散点图发现异常数据。
# 箱线图分析: 利用数据中的五个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据。
# 3σ法则: 在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值。
# 8.1 散点图方法: 通过数据分布的散点图发现异常数据。
import matplotlib.pyplot as plt
li=np.arange(20)
wfd=pd.DataFrame(li,columns=['W'])
print(wfd)
wfd['Y']=wfd['W']*1.5+2
print(wfd)
wfd.iloc[3,1]=128
wfd.iloc[18,1]=150
print(wfd)
# wfd.plot(kind='scatter',x='W',y='Y')等价于
plt.scatter(x=wfd['W'],y=wfd['Y'])
plt.show()
# 8.2 箱线图分析:箱线图利用数据中的五个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据,
# 它也可以粗略地看出数据是否具有对称性、分布的分散程度等信息。
plt.boxplot(wfd['Y'])
wfd.plot(kind='box')
plt.show()
# 9、数据转换
# 9.1 数据值替换
# 数值替换是将查询到的数据替换为指定数据。
# 在pandas中通过replace进行数据值的替换。
data1=pd.DataFrame([1,2,3,'',3],columns=['value'],index=['x','y','z','g','h'])
print(data1)
data1=data1.replace('',"替换值")
print(data1)
# replace传入字典实现多值替换
data1=data1.replace({3:'字典替换'})
print(data1)
# 利用函数或映射进行数据转换
# 更换索引
data1 = data1.rename(index={"x":"tj","y":"sh"},columns={"value":"更换索引"})
print(data1)
# # 6.3 文件存储
#选择路径,默认问同工程文件夹下
data1.to_csv('test.csv')
data1.to_excel('test.xls')