01/21/2019 python

Pandas
pandas的数据结构
time-Series:以时间为索引的Series
DataFrame:带标签的二维表格型数据结构,可以将DataFrame理解为Series的容器
Panel:带标签的三维数组,可以理解为DataFrame的容器

Series数据结构
Series(序列)是一种类似于一维数组的对象,它是由一组(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成
Series的字符串表现形式为:索引在左边,值在右边,由于没有为数据指定索引,于是会自动创建一个0 - N-1(N为数据)的整数型索引
Series数组运算都会保留索引和值之间的链接
标量 ->Series
– 如果数据是标量值,则必须提供索引,将重复值以匹配索引的长度
ndarray -> Series
– ndarray可直接转换为Series
字典->Series
– 字典(dict)可以作为输入传递,如果没有指定索引,则按排序顺序取得字典键以构造索引;如果传递了索引,索引中与标签对应的数据中的值将被拉出,缺少的元素用NaN填充
– 重要功能:在算术运算中自动对齐不同索引的数据

DataFrame
数据帧是二维数据结构,即数据以行和列的表格方式排列
DataFrame可以被看成是以Series组成的字典,它和Series的区别在于,不但具有行索引,而且具有列索引
功能特点:
– 潜在的列是不同的类型
– 大小可变
– 标记轴(行和列)
– 可以对行和列执行算术运算
Pandas数据帧可以使用各种输入创建
– 列表
– 字典
– 序列
– Numpy ndarrays
– 另一个数据帧(DataFrame)
列表或元组组成的列表->DataFrame
等长列表,元组,数组,序列组成的字典->DataFrame

字典组成的字典(嵌套字典)->DataFrame
列名:嵌套字典的外层子键
索引:内层键
nest_dict={‘shanghai’:{2015:100,2016:101},‘beijing’:{2015:102,2016:103}} #嵌套字典构成,外层key会形成columns,内层key会形成index,另外,对于内部字典的长度是可以不等长的,对于缺失的内部字典的缺失值自动填充NaN
df=DataFrame(nest_dict)
df

字典或Series的列表-> DataFrame

jason数据格式整理:
https://www.cnblogs.com/qingruihappy/p/7822652.html

s[1:3]#Series切片,对于数字的切片适用于左闭右开,而对于索引名(用loc)的切片,则是左闭右闭

‘a’ in s#对索引进行判断,判断是否有索引名为‘a’在Series s里

#iloc(自动索引)和loc(手动索引)
s.iloc[1:3]#切片
s.iloc[0:1]#切片,左闭右开
s.loc[‘a’]
s.loc[‘d’:‘a’]#左右封闭
*****注意:iloc和loc的主要区别在于iloc是用数字或者说原始的索引0,1,2,3来引用索引对应的数值;而loc是用新定义的索引标签比如‘a’,‘b’,‘c’,'d’来引用索引名对应的数值

df.loc[:,‘A’]# 选择一列;这里对‘A’没有加括号,表示取得的结果是Series
df.loc[:,[‘A’]] #同上对比,这里对’A’加了括号后表示这是切片,切片的含义是切完后之前是什么现在还是什么

df.loc[df.A > 0, df.loc[‘a’] > 0]#选A列里大于0的值的行数,再选择‘a’行里大于0的列数,组成新的对应的行和列数组

df[df.B<0]#选择B列小于零的所有行
df[df>0]#选择所有大于零的,小于零的填充缺失值

df[df.E.isin([‘two’,‘three’])]#选择E列里面是two和three的所有行

重新索引
pandas对象的一个重要方法是reindex,其作用是创建一个适应新索引的新对象
reindex插值方法(method)
– ffill或pad:前向填充值
–bfill或backfill:后向填充值
s=Series([‘blue’,‘purple’,‘yellow’], index=[0,2,4])#index为时间序列
s.reindex(range(6), method=‘bfill’)#重复操作,后向填充是用后面的值填充前面index里是空的值
Series的重新索引和插值
DataFrame的重新索引和插值

obj1.drop(‘e’)#删除DataFrame里的一个column,这里是新生成的

df.drop([‘a’,‘c’],axis=0)#删除行,指定0轴方向

df.assign(ln_one = lambda x: np.log(x.one), abs_two = lambda x: np.abs(x.two))#按指定要求增加列,这里的x指的就是df

df.dropna(how=‘all’,axis=0)#删除所有值为nan的行

df.dropna(how=‘any’,axis=0)#删除只要有nan的行

数据清洗:
普通数据的替换
缺失值替换和填充:数据是宝贵的,因为数据越多对模型训练都有好处,所以很多时候我们不想删数据,因此通常我们用一些特殊值来填充数据
– 指定特殊值填充缺失值
ex:
df.replace(’–’,np.nan) #对于‘–’用nan来进行填充
– 不同列使用不同的缺失值
– 前向填充和后向填充
df.fillna({1:1,2:2})#不同列使用不同的数填充,这里表示第一列用1填充,第二列用2填充
– 使用列的平均值进行填充

ser.interpolate()#线性插值

ser.interpolate()#线性插值

df.set_index([‘位置’,‘价格’]).sortlevel(1)#为了方便查看,可先设置索引,之后再对索引进行排序,而这里sortlevel是按照具体哪个索引进行排序

data.idxmax()#每一列中最大值的行索引

df = pd.DataFrame([
[1,2],
[3,4]
])
df.apply(lambda x:x*10)#这里的x指的是整个的df;
#另外,apply()方法里所应用的是其他的方法给每个元素

df.count()#每一列非空值的数量

pandas经常被用于处理与时间相关的数据,尤其像财务数据,在处理时间序列数据时,会遇到各种需求,包括:
生成固定跨度时期构成时间序列
将现有的时间序列,转换成需要的时间序列格式
计算序列中的相对时间,如每季度的第一周

t2=pd.Timestamp(‘1/10/2017 13:30:59’) #用timestamp可将非标准时间转换为ts的标准时间
t2

rng1 = pd.date_range(‘1/10/2017’, periods=24, freq=‘H’)#生成时间索引,以小时为单位,periods表示有24个阶段
rng1

import pandas as pd
import numpy as np
rng = pd.date_range(‘1/1/2011’, periods=72, freq=‘H’)
ts = pd.Series(np.random.randn(len(rng)), index=rng) #以rng的index为准,随机产生rng长度(72)的随机数
ts

converted = ts.asfreq(‘45Min’, method=‘pad’)#转为其他时间间隔;这里的pad表示前向填充(‘ffill’)
converted

时间转换to_datetime是pandas用于处理时间序列的一个重要方法,它可以将实参转换为时间戳

#From Timestamps to Epoch,转为新纪元时间
stamps = pd.date_range(‘2012-10-08 18:15:05’, periods=4, freq=‘D’)
(stamps - pd.Timestamp(“1970-01-01”)) // pd.Timedelta(‘1ns’) #’//'表示取整;Timedelta(‘1ns’)表示它们lns的时间间隔

pandas里的merge更类似sql里的join
而pandas里的join更类似于sql里的横向拼接,如果有相同名称的column,则这两个column需要分别命名后再都显示出来
ex: merge
res = pd.merge(left, right, on=[‘key1’, ‘key2’], how=‘inner’)
res
ex: join
#join
df1 = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K2’, ‘K3’, ‘K4’, ‘K5’],‘A’: [‘A0’, ‘A1’, ‘A2’, ‘A3’, ‘A4’, ‘A5’]})
df1
df2 = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K2’],‘B’: [‘B0’, ‘B1’, ‘B2’]})
df2
df1.join(df2, how=‘outer’,lsuffix=‘A’, rsuffix=‘B’)

df.stack()#将行转为列,将每一样水果的数量,价格单独列出,
df1.unstack()#将列转为行

df.pivot(‘水果种类’,‘信息’,‘值’)#将水果种类作为行索引,将信息作为列索引

pandas分组运算
过程:对数据进行分组操作的过程可概括为:split-apply-combine三步
– 按照键值(key)或者分组变量将数据分组
– 对每组应用函数(python自带函数或自己编写的函数)
groupby技术
– 生成groupby对象
– groupby调用方法进行计算
– 分组迭代
– 部分列的聚合
– 通过函数进行分组
– 将函数计算后的结果聚合
ex:
df[[‘类别’,‘数量’]].groupby(‘类别’).sum()#类别的和
df.groupby(‘类别’)[‘数量’].sum()
##注意:这两者的区别在于,第一个是将类别和数量选出后再根据类别进行groupby,之后再把数值型数据的数量进行汇总;而第二个是先根据类别进行分类,之后从类别分类后的数值型数据中选出数量column,再将其进行汇总

#groupby是可迭代对象,可以产生一组二元数组(由分组名称和数据块构成)
for name,group in df.groupby(‘类别’):
print(name)
print(group)

for (k1,k2),group in df.groupby([‘产地’,‘类别’]):
print(k1,k2)
print(group)

df.groupby([‘产地’,‘类别’]).size()#在分类的类别里有几个值
df.groupby([‘产地’,‘类别’]).count() #用count也可以

mapping={‘a’:‘red’,‘b’:‘red’,‘c’:‘blue’,‘d’:‘blue’,‘e’:‘red’}#通过字典进行映射,映射后再进行相应的groupby
people.groupby(mapping,axis=1).sum()

数据聚合(agg):指能从数组产生的标量值的数据转换过程,常见的聚合运算都有相关的统计函数快速实现,也可自定义聚合运算
– 传入标准方法(内置聚合函数)
– 自定义方法
– 调用多个聚合函数
– 对函数加元组,提供新的列名
– 使用字典实现数据集的每列作用不同的聚合函数
agg()在这里有点类似apply()方法,通过调用其他函数来扩展原有的聚合功能
ex:
#1,传入标准函数
df.groupby([‘key1’]).agg([np.mean])

#同时调用多个聚合函数
df.groupby([‘key1’]).agg([‘mean’,‘std’,‘count’,peak_to_peak])#调用多个聚合函数

#使用字典实现数据集的每列作用于不同的聚合函数
dict_mapping={‘data1’:‘mean’,‘data2’:‘sum’}
df.groupby(‘key1’).agg(dict_mapping)

分组运算和转换:聚合仅是分组运算的一种,它是数据转换的一个特例,transform和apply方法可以执行更多其他的分组运算
transform(如何减去均值)
– 方法1: 对分组求均值,然后把这个均值赋值给整个组(可广播的标量值)
– 方法2:使用transform实现去均值(返回与分组大小相同的结果数组)
apply:apply会将分组传递给函数,然后尝试将函数的返回结果组合起来
ex:
#transform方法
demean = lambda arr:arr-arr.mean()
df.groupby(‘类别’).transform(demean)

透视表与交叉表
透视表
– 透视表指根据一个或多个键值对数据进行聚合,根据行或列的分组键将数据划分到各个区域中
交叉表
– 交叉表是用于统计分组的频率的特殊透视表

df.pivot_table(index=‘产地’,columns=[‘类别’])#同时指定,且计算出均值

#交叉表,统计分组的频数
pd.crosstab(df[‘类别’],df[‘产地’])

注意:透视表一般是groupby之后计算的平均值

数据清洗的过程
1、查看数据类型 2、查看Shape 3、是否有缺失值 4、对数据进行清洗 5、重新设置索引 6、查看哪个国家城市最多 7、查看哪个国家人口最多

猜你喜欢

转载自blog.csdn.net/weixin_41636030/article/details/86587014