文章目录
数据分析流程:了解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')