【Python数据分析】【Pandas】Series、DataFrame


数据分析流程:了解Python基础知识->获取数据源->数据预处理->数据筛选->数值操作->数据运算->时间序列->数据分组->多表拼接->结果导出->数据可视化

Pandas数据类型

Pandas是基于Numpy 的一套数据分析工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量标准的数据模型,提供了高效地操作大型数据集所需的工具。
Pandas中两个重要的数据类型:Series和DataFrame。Series表示数据列表,DataFrame表示二维数据集。

创建Series数据列表

Series对象由一组数据+一组与之相关的数据标签(行索引)。
pandas中两个重要的属性values和index,values是Series对象的原始数据。index对应了 Series 对象的索引对象。

import pandas as pd

# 创建Series
s1 = pd.Series(["a","b","c","d"]) # 传入列表
s2 = pd.Series([1,2,3,4], index = ["a","b","c","d"]) # 自定义索引
s3 = pd.Series({"a":1, "b":2, "c":3}) # 传入一个字典
print(s1,'\n', s2,'\n', s3)

print("索引:",s1.index) # 获取索引
print("值:",s1.values) # 获取值

在这里插入图片描述

获取Series对象的值

标签索引进行切片时候是左闭右闭,而位置索引是左闭右开
当位置索引与标签索引有相同值,使用loc表示的是标签索引,iloc表示的是位置索引。

import numpy as np
import pandas as pd

data = pd.Series([4,3,25,2,3],index=list('abcde'))
print('根据key获取:',data['a'])
print('切片获取:',data['a':'d'])
print('索引获取:',data[1])
print('索引切片:',data[2:4])

创建DataFrame表格型数据结构

DataFrame对象由一组数据+一对索引(行索引和列索引)。
将两个series对象作为字典的值,就可以创建一个DataFrame 对象。
DataFrame 对象的values、index和 columns属性

# 创建一个DataFrame
df1 = pd.DataFrame([["a","A"], ["b","B"], ["c","C"]]) # 传入一个嵌套列表/元组
df2 = pd.DataFrame([["a","A"], ["b","B"], ["c","C"]], 
                   index=["一","二","三"], columns=["小写","大写"]) # 设置行、列索引

data = {"小写":["a","b"],"大写":["A","B"]} # 字典的key值相当于列索引
df3 = pd.DataFrame(data, index=["一","二"])

print(df1)
print(df2)
print(df3)
print(df1.columns) # 获取列索引
print(df2.index) # 获取行索引

在这里插入图片描述

获取DateFrame对象的值

import numpy as np
import pandas as pd

data = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('ABCD'))

# 获取某一列
print(data['B']) # 列索引
print(data.iloc[:,0]) # 传入位置

# 获取某几列
print(data[['A','C']])
print(data.iloc[:,[0,2]])

# 同时选择不连续的部分行和部分列
print('同时获取 a c 行,ABD 列,使用普通索引:')
print(data.loc[['a','c'],['A','B','D']])
print('同时获取 a c 行,ABD 列,使用位置索引:')
print(data.iloc[[0,2],[0,1,3]])

Series数据运算方法

import pandas as pd
data = pd.DataFrame({
'Name':['zs','lisi','ww'],
'Sno':['1001','1002','1003'],
'Sex':['man','woman','man'],
'Age':[17,18,19],
'Score':[80,97,95]
},columns=['Sno','Sex','Age','Score'],index=['zs','lisi','ww'])
display('数据集',data)
ages = data['Age']
display('获取数据集中 Age 列的所有',ages)
print('计算 Age 列的平均值:',ages.mean())
print('计算 Age 列的最大值:',ages.max())
print('计算 Age 列的最小值:',ages.min())
print('计算 Age 列的标准差:',ages.std())
display('对 Age 进行降序排序:',ages.sort_values(ascending=False))

数据筛选

import pandas as pd
data = pd.DataFrame({
'Name':['zs','lisi','ww'],
'Sno':['1001','1002','1003'],
'Sex':['man','woman','man'],
'Age':[17,18,19],
'Score':[80,97,95]
},columns=['Sno','Sex','Age','Score'],index=['zs','lisi','ww'])
display('数据集',data)
scores = data['Score']
print('输出数据中所有成绩大于平均值的记录',data[scores>scores.mean()])
# data[(scores>scores.mean()) & (ages<19)] #多重条件过滤
# data[(scores>scores.mean()) | (ages<19)] #多重条件过滤
print(' 获 取 成 绩 大 于 平 均 值 得 所 有 记 录 , 只 显 示 Sno Age Score 三 列 :',data[scores>scores.mean()].loc[:,['Sno','Age','Score']])

缺失值处理

缺失值就是由某些原因导致部分数据为空,对于为空的这部分数据我们一般有两种处理方式,一种是删除,即把含有缺失值的数据删除;另外一种是填充,即把缺失的那部分数据用某个值代替。

import pandas as pd
import numpy as np

data=pd.Series([3,4,np.nan,1,5,None])
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])

# 缺失值查看
print(df.info())
print(data.isnull())
print('获取缺值:')
print(data[data.isnull()])
print('获取非空值')
print(data[data.notnull()])

# 缺失值删除
print('默认为以行为单位剔除:')
display(df.dropna())
print('以列为单位剔除:')
display(df.dropna(axis='columns'))
print('所有为 nan 时候才剔除:')
display(df.dropna(how='all'))
print('默认情况,只要有就剔除')
display(df.dropna(how='any'))

# 缺失值填充
data=pd.Series([3,4,np.nan,1,5,None])
print('以 0 进行填充:')
display(data.fillna(0))
print('以前一个数进行填充:')
display(data.fillna(method='ffill'))
print('以后一个数进行填充:')
display(data.fillna(method='bfill'))
print('先按前一个,再按后一个')
display(data.fillna(method='bfill').fillna(method='ffill'))

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
print('使用数值 0 来填充:')
display(df.fillna(0))
print('使用行的前一个数来填充:')
display(df.fillna(method='ffill'))
print('使用列的后一个数来填充:')
display(df.fillna(method='bfill' ,axis=1))

# 以列平均数进行填充
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
for i in df.columns:
    df[i]=df[i].fillna(np.nanmean(df[i]))
print(df)

拼接

concat函数

Series 对象拼接

ser1=pd.Series([1,2,3],index=list('ABC'))
ser2=pd.Series([4,5,6],index=list('DEF'))
pd.concat([ser1,ser2])

两个 df 对象拼接,默认找相同的列索引进行合并

def make_df(cols,index):
data={c:[str(c)+str(i) for i in index] for c in cols}
return pd.DataFrame(data,index=index)
df1=make_df('AB',[1,2])
df2=make_df('AB',[3,4])
pd.concat([df1,df2])

# 两个 df 对象拼接,添加 axis 参数
df1=make_df('AB',[1,2])
df2=make_df('AB',[3,4])
pd.concat([df1,df2], axis=1) #或者 pd.concat([df1,df2],axis='columns')

# 两个 df 对象拼接,索引重复问题
x=make_df('AB',[1,2])
y=make_df('AB',[1,2])
pd.concat([x,y])

# 两个 df 对象拼接,解决索引重复问题加 ignore_index 属性
x=make_df('AB',[1,2])
y=make_df('AB',[1,2])
pd.concat([x,y],ignore_index=True)

# 两个 df 对象拼接,解决索引重复问题,加 keys 属性
x=make_df('AB',[1,2])
y=make_df('AB',[1,2])
pd.concat([x,y],keys=list('xy'))

# 两个 df 对象拼接,join 内连接做交集
a=make_df('ABC',[1,2])
b=make_df('BCD',[3,4])
pd.concat([a,b],join='inner')

merge函数

pandas 中 的 merge 和 concat 类似,但主要是用于两组有 key column 的数据,统一索引的数据。通常也被用在 Database 的处理当中。
合并时有 4 种方式 how = [‘left’, ‘right’, ‘outer’, ‘inner’],默认值 how=‘inner’。
merge 的使用,默认以 how=’inner’进行合并

left=pd.DataFrame({'key':['k0','k1','k2','k3'],
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3'],
})
right=pd.DataFrame({'key':['k0','k1','k4','k3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3'],
})
result=pd.merge(left,right)
# merge 的使用,参数 how=’outer’进行合并
left=pd.DataFrame({'key':['k0','k1','k2','k3'],
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3'],
})
right=pd.DataFrame({'key':['k0','k1','k4','k3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3'],
})
pd.merge(left,right,how='outer')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值