Python常用包学习(四)——pandas

笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。

我的公众号为:livandata

pandas主要是对一维、二维的数据进行操作,类似于numpy,但是比numpy规范:
pandas是有两种数据结构组成:series与dataframe两种;

dataframe的数据处理方式几乎可以涵盖所有的sql操作,可以非常灵活的处理数据,记录下面的方法以方便后续操作。

'''1、一维序列的操作'''

# -*- coding: utf-8 -*-
import pandas as pd
'''1)series:类似于一维数组,由一组数据与对应的标签组成:'''
obj = pd.Series([1,2,3,4], index=['a','b','c','d'])
obj = pd.Series([1,2,3,4])
# 获取obj的索引和values:
print(obj.index)
print(obj.values)
# 根据key取值:
print(obj['a'])
# 在obj中加获取条件:
print(obj[obj.values>2])
# # 可以直接运行函数:
print(sum(obj))
# 判断key为3的值是否存在:
print(3 in obj)
# 可以直接通过字典来创建series:
a = {'a':1,'b':2,'c':3,'d':4}
obj2 = pd.Series(a)
print(obj2)
# 如果a中有值,则会根据index获取对应的值,然后f部分为空值;
b = pd.Series(a, index={'c','d','f'})
print(b)
# 判断values是否为空
print(pd.isnull(b))
# series本身都有一个name属性:
b.name='test'
b.index=['1','2','3']
print(b)

'''2、DataFrame:是表格型的数据结构,类似于两维的数组:'''

'''数据集整理'''
data = {'state':['beijing','shanghai','hangzhou'],'pop':['1,2','3.4','5'],'year':['2000','2001','2002']}
frame = pd.DataFrame(data)
print(frame)
# 上面的内容为默认顺序排列的,如果希望指定顺序,需要指定columns:
frame2 = pd.DataFrame(data, columns = ['state','year','pop'])
print(frame2)
# 也可以加入序号,没有的列显示为nan:
frame3 = pd.DataFrame(data, columns = ['state','pop','year','debt'], index=[1,2,3])
print(frame3)
# 设置索引和列:
frame.index.name = 'year'
frame.columns.name = 'state'
print(frame)
# df的空值为True
df.isnull()
# df的非空值为True
df.notnull()
# 修改列名
df.rename(columns = {'key':'key2'},inplace=True)
# 更改数据格式
data['t1'].astype(np.int64)
# more example:
# 列名去除空格:
data.columns = [i.strip() for i in data.columns]

'''3、索引的设置:'''

'''索引设置:'''
reindex()
# 更新index或者columns,
# 默认:更新index,返回一个新的DataFrame
# 返回一个新的DataFrame,更新index,原来的index会被替代消失
# 如果dataframe中某个索引值不存在,会自动补上NaN
df2 = df1.reindex(['a','b','c','d','e'])
# fill_valuse为原先不存在的索引补上默认值,不在是NaN
df2 = df1.reindex(['a','b','c','d','e'],  fill_value=0)
# inplace=Ture,在DataFrame上修改数据,而不是返回一个新的DataFrame
df1.reindex(['a','b','c','d','e'],  inplace=Ture)
# reindex不仅可以修改 索引(行),也可以修改列
states = ["Texas","Utah","California"]
df2 = df1.reindex( columns=states )
set_index()
# 将DataFrame中的列columns设置成索引index
# 打造层次化索引的方法
# 将columns中的其中两列:race和sex的值设置索引,race为一级,sex为二级
# inplace=True 在原数据集上修改的
adult.set_index(['race','sex'], inplace = True)
# 默认情况下,设置成索引的列会从DataFrame中移除
# drop=False将其保留下来
adult.set_index(['race','sex'], inplace = True)
reset_index()
# 将使用set_index()打造的层次化逆向操作
# 既是取消层次化索引,将索引变回列,并补上最常规的数字索引
df.reset_index()

'''索引排序'''
# 默认axis=0,按行索引对行进行排序;ascending=True,升序排序
df.sort_index()
# 按列名对列进行排序,ascending=False 降序
df.sort_index(axis=1, ascending=False)
# 值排序
# 按值对Series进行排序,使用order(),默认空值会置于尾部
s = pd.Series([4, 6, np.nan, 2, np.nan])
s.order()
df.sort_values(by=['a','b'])#按列进行排序
# 排名
a=Series([7,-5,7,4,2,0,4])
a.rank()#默认method='average',升序排名(ascending=True),按行(axis=0)
#average 值相等时,取排名的平均值
#min 值相等时,取排名最小值
#max 值相等时,取排名最大值
#first值相等时,按原始数据出现顺序排名

'''4、数据的获取与整理'''

'''取数据:'''
# 获取列的值:
print(frame['A'])
# 获取行的值:
print(frame.iloc[1])
print(frame.loc['a'])
# 取某一条件的数据:
data[(data['t1']>'20190202')&(data['t2']<='20190208')]
# 取第几行:
data[:][0:3]
# 取一列的值:
print(frame['state'])
# 取某几列的数据:
data[['t1','t2']]
# 取一行的值:
print(frame.ix[1])
# 可以填充数值:
debt = pd.Series([5,5], index=[1,2])
frame['debt'] = debt
print(frame)
# 删除数据:
print(frame)
del frame['year']
print(frame)
# [行,列]
data.loc[1:2, ['r1','r2']]
# map与lambda
alist = [1,2,3,4]
#map就是将自定义函数应用于Series每个元素
map(lambda s : s+1, alist)
df['sepal_length'].map(lambda s:s*2+1)[0:3]
# apply和applymap
# apply和applymap是对dataframe的操作,前者操作一行或者一列,后者操作每个元素
df[‘column1’].map(lambda x: 10+x),
df[‘column2’].map(lambda x: ‘AV’+x),
df[[‘column1’,’column2’]].apply(sum)
df0[['data1']].apply(lambda s:s+1)
# ApplyMap: 对dataframe的每一个元素施加一个函数
func = lambda x: x+2
df.applymap(func),
# dataframe每个元素加2 (所有列必须数字类型)
# contains
# 使用DataFrame模糊筛选数据(类似SQL中的LIKE)
# 使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次
df_obj[df_obj['套餐'].str.contains(r'.*?语音CDMA.*')]
# 下面两句效果一致
df[df['商品名称'].str.contains("四件套")]
df[df['商品名称'].str.contains(r".*四件套.*")]

'''5、常见函数的运算'''

'''运算函数:'''
dic2 = {'A':{'a':1,'b':2,'c':3},'two':{'a':4,'b':5,'c':6},'three':{'a':11,'b':12,'c':13}}
d1 = pd.DataFrame(dic2)
d4 = d3['A']
# 均值计算过程中会遇到相关问题:sum()函数可以对str进行运算,但是mean函数不行,必须是数值型;
# 需要进行相应的转换:
import numpy as np
d4 = d4.astype(np.int64)
d4_mean = d4.mean()
d4_sum = d4.sum()
print(d3)
data = {'A':{'a':1,'b':2,'c':3},'B':{'a':4,'b':5,'c':6},'C':{'a':7,'b':8,'c':9}}
frame = pd.DataFrame(data)
print(frame)
# 数值的函数应用
print(frame.iloc[1].max())
# 相关系数
print(frame.corr('spearman'))
# 方差
print(frame.cov())
# 增加新的行或列:
dic2 = {'A':{'a':1,'b':2,'c':3},'two':{'a':4,'b':5,'c':6},'three':{'a':11,'b':12,'c':13}}
d1 = pd.DataFrame(dic2)
new_dic = {'four':{'a':13,'b':14,'e':16}}
d2 = pd.DataFrame(new_dic)
# 数据集的拼接:
d3 = pd.concat([d1, d2])
print(d3)
# 增加行列时需要也可以新建一个dataframe,然后插入新值
# 使用分组函数:
print(frame.groupby('A').mean())
# 两个表的关联:
stu = pd.merge(frame, d1, on='A')
print(stu)
# more example:
data['te'].groupby(data['t3']).sum()

'''6、缺失值的处理方式:'''

'''缺失值:'''
# 丢弃值drop()
df.drop(labels, axis=1)# 按列(axis=1),丢弃指定label的列,默认按行。。。
# 丢弃缺失值dropna()
# 默认axi=0(行);1(列),how=‘any’
df.dropna()#每行只要有空值,就将这行删除
df.dropna(axis=1)#每列只要有空值,整列丢弃
df.dropna(how='all')# 一行中全部为NaN的,才丢弃该行
df.dropna(thresh=3)# 每行至少3个非空值才保留
# 缺失值填充fillna()
df.fillna(0)# 用0来填补nan项:
df.fillna({1:0,2:0.5}) #对第一列nan值赋0,第二列赋值0.5
# 填充特定值:
d3.fillna({'A':1, 'four':2,'three':3, 'two':4})
# 用前一个值填充,用后一个值填充:
print(d4.fillna(method='ffill'))
print(d4.fillna(method='bfill'))

'''7、替换值的处理'''

'''替换值replace()'''
# 将df的A列中 -999 全部替换成空值
df['A'].replace(-999, np.nan)
#-999和1000 均替换成空值
obj.replace([-999,1000],  np.nan)
# -999替换成空值,1000替换成0
obj.replace([-999,1000],  [np.nan, 0])
# 同上,写法不同,更清晰
obj.replace({-999:np.nan, 1000:0})

'''8、值去除重复'''

'''值去重:'''
# 重复值处理duplicated(),unique(),drop_duplictad()
df.duplicated()#两行每列完全一样才算重复,后面重复的为True,第一个和不重复的为false,返回true
#和false组成的Series类型
df.duplicated('key')#两行key这一列一样就算重复
df['A'].unique()# 返回唯一值的数组(类型为array)
df.drop_duplicates(['k1'])# 保留k1列中的唯一值的行,默认保留第一行
df.drop_duplicates(['k1','k2'], take_last=True)# 保留 k1和k2 组合的唯一值的行,take_last=True 保留最后一行

'''9、透视图:'''

# 创建透视表:unstack()是指将结果进行非堆叠操作;
pf = pd.pivot_table(d3, values=['A','four'], columns=['two']).unstack()
df = pd.DataFrame(np.random.randint(10, 50, 20).reshape(5,4),
                  index=[['A','A','A','B','B'],[1,2,3,1,2]],
                  columns=[['X','X','X','Y'],['x1','x2','x3','y']])
# 按行取值:
print(df.ix[['A']])
# 按列取值:
print(df['X'])

引用:

https://blog.csdn.net/zhili8866/article/details/68134481

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值