pandas系列(Series)、数据帧(DataFrame)、文件读取(csv、excel)、缺失值填充处理、分组后聚合、统计相关函数

#pandas三种数据类型:
#一维:系列 Series 二维:数据帧 DataFrame 三维:面板 Panel
#系统默认下标:0,1,2,…

1. 系列

import numpy as np
import pandas as pd
#1.用 list(列表) 创建系列
s1=pd.Series([1,3,5,7])
print(s1)

#2.用数组创建系列
data=np.array([1,3,5,7])
#自定义下标 index=[],必须是list形式:可以是数字,也可以是字符串
index=['a','b','c','d']
s2=pd.Series(data,index)
print(s2)

#3.用字典dict创建系列
#key(键):下标     value(值):对应的数据
data3={'a':1,'b':3,'c':5}
s3=pd.Series(data3)
print(s3)

#4.创建数据全是18的系列
s4=pd.Series(18,index)
print(s4)

2. 数据帧

import numpy as np
import pandas as pd
#1.创建数据帧
#(1)用list创建  按照行来
data=[['Sam',18,'M'],['Amy',20,'F'],['Tom',16,'M']]
index=['a','b','c']     #添加样本标签(横轴标签)
columns=['name','age','sex']   #添加特征标签
df1=pd.DataFrame(data,index,columns)
print(df1)

#(2)用系列创建
s1=pd.Series(['Sam',18,'M'],index=['name','age','sex'])
s2=pd.Series(['Amy',20,'F'],index=['name','age','sex'])
s3=pd.Series(['Tom',16,'M'],index=['name','age','sex'])
df2=pd.DataFrame([s1,s2,s3],index)
print(df2)

#(3)用字典dict创建  按照列来
#key(键): 特征名   value(值):一列数据
data={'name':['Sam','Amy','Tom'],'age':[18,20,16]}
df3=pd.DataFrame(data,index)
print(df3)

#2.缺失值  NaN: not a number  当前数据是空值,不是0
data=[['Sam',18,'M'],['Amy',np.NaN,'F'],['Tom',16,'M']]
index=['a','b','c']
columns=['name','age','sex']
df1=pd.DataFrame(data,index,columns)
print(df1)

#3.有关列的处理
data=[['Sam',18,'M'],['Amy',20,'F'],['Tom',16,'M']]
index=['a','b','c']     #添加样本标签(横轴标签)
columns=['name','age','sex']   #添加特征标签
df=pd.DataFrame(data,index,columns)
print(df)
#(1)查看某列
print('查看name列\n',df['name'])
print('同时查看name,sex两列\n',df[['name','sex']])

#(2)添加一列 MScore: 数据为90,100,80
df['MScore']=[90,100,80]
print(df)
df['CScore']=[83,92,77]
print(df)

#(3)添加一列 Sum:数据为 Mscore列数据 +CScore列数据
df['Sum']=df['MScore']+df['CScore']
print(df)

#(4)删除某列
# 方法一:
del df['age']  #在原来的数据帧上直接删除,改变了原来的数据帧
print(df)
#方法二
df_1=df.drop(labels=['sex'],axis=1,inplace=True)
print('===df===\n',df)
print('===df_1===\n',df_1)
#if inplace=True 在原来的数据帧上直接删除,改变了原来的数据帧 ==del
#if inplace=False 则不是在原来的数据帧上删除,返回一个删除后的副本,不改变原来的数据帧

#4.有关行的处理
data=[['Sam',18,'M'],['Amy',20,'F'],['Tom',16,'M']]
index=['a','b','c']     #添加样本标签(横轴标签)
columns=['name','age','sex']   #添加特征标签
df=pd.DataFrame(data,index,columns)
print(df)
#(1)查看某行
print('查看Amy所在行\n',df.loc['b']) #通过自定义下标
print('查看Amy所在行\n',df.iloc[1]) #通过系统默认下标

#(2)添加一行  添加一行:小姐姐  25  F
df_N=pd.DataFrame({'name':['小姐姐'],'age':[25],'sex':['F']},index=['d'])
df=df.append(df_N)
print(df)

#(3)删除某行
#删除Tom所在的行
df_2=df.drop(labels=['c'],axis=0,inplace=False)
print('====df====\n',df)
print('====df_2====\n',df_2)

3. 文件读取

import numpy as np
import pandas as pd
#1.读取csv格式文件
df1=pd.read_csv(r'../data/HeightWeight.csv')
#df1=pd.read_csv(r'E:\人工智能代码\数理2\1912B数理二\data\HeightWeight.csv')
#print(df1)
print(df1.head(10))#获取前10行数据 ()里不写,默认的是5
print(df1.tail(3)) #获取后3行数据 ()里不写,默认的是5

#2.数据查询
#(1)查询 身高 Height(cm)=160的信息
#条件:df1['Height(cm)']==160
print(df1[df1['Height(cm)']==160])

#(2)查询 Sex=1,Height(cm)=160的信息
#(条件1) 且 (条件2)
#df1[()&()]
print(df1[(df1['Sex']==1)&(df1['Height(cm)']==160)])

#(3)查询 Height(cm) 在165--170的信息
# Height(cm)>=165  且  Height(cm)<=170
#df1[()&()]
print(df1[(df1['Height(cm)']>=165)&(df1['Height(cm)']<=170)])

#(4)查询身高 Height(cm)=161,162,163
#()|()|()
print(df1[df1['Height(cm)'].isin([161,162,163])])

#3.读取csv格式文件
df3=pd.read_csv(r'../data/测试.csv',header=2,delimiter=':',names=['x1','x2','x3'])
#header=2:特征标签行是第3行,不写默认第一行是标签行
#header=None:表示原始文件没有特征标签行
#delimiter=':' 表示数据用:隔开
#names=['x1','x2','x3'] :指定新的特征名(列名)
print(df3)

#4.读取xls/xlsx格式文件
df4=pd.read_excel(r'../data/loans.xls')
print(df4.head(3))
df5=pd.read_excel(r'../data/销售情况统计表.xlsx',sheet_name='1903A')
#sheet_name='1903A':读取名字为1903A的子表
print(df5)

4. 缺失值的处理

import numpy as np
import pandas as pd
data=[['Sam',18,'M'],['Amy',np.NaN,'F'],['Tom',16,'M']]
index=['a','b','c']
columns=['name','age','sex']
df1=pd.DataFrame(data,index,columns)
print(df1)
#1.(1)判断数据帧是否为空,是空返回Ture,不是空返回False
print(df1.isnull())
#(2)定位到具体某一特征下
print(df1['age'].isnull())
#输出是空的行的数据
print(df1[df1['age'].isnull()])

#2.输出Age下,为非空的行
#notnull:不是空值返回Ture,是空值返回False
print(df1['age'].notnull())
print(df1[df1['age'].notnull()])

#3.返回数据帧的基本信息
df1.info()

#4.删除缺失值所在的行
print(df1.dropna())

#5.(1)统计每个特征下缺失值的数量
print(df1.isnull().sum())
#(2)查看缺失值所在的列名
print(df1.columns[df1.isnull().sum()>0])

#6.填充缺失值 填平均数/中位数,对整体数据影响最小
df_1=df1.fillna(25)
print('===df1===',df1)  #原来的df1没变,df_1变了
print('===df_1===',df_1)
#df_1=df1.fillna({'age':25,'score':80})

#7.查看数据帧的描述
print(df1.describe())
#count:频数(总数)   mean:平均数   std:标准差   min:最小值  max:最大值
#50%:中位数:按照从小到大的顺序排列,位于中间位置的数
#25%:较小四位分数:按照从小到大的顺序排列,位于1/4位置的数
#75%:较大四位分数:按照从小到大的顺序排列,位于3/4位置的数

5. 统计相关函数

import numpy as np
import pandas as pd
#和:sum   最大值:max  最小值:min   平均数:mean   中位数:median
#方差:var   标准差:std   频数:count
#loans.xls
df=pd.read_excel(r'../data/loans.xls')
print(df.tail(3)) #后3行
#1.统计每月归还额的总和
print(df['每月归还额'].sum())
#2.统计每月归还额的样本数(频数)
print(df['每月归还额'].count())
#3.统计不同的还款状态分别有多少个样本
print(df['还款状态'].value_counts())

#4.排序
#对1列排列:对贷款金额列数据升序排序
#ascending=True:升序   ==False:降序
print(df.sort_values('贷款金额',ascending=True))
#对2列排序:先对贷款期限降序排序,再对贷款金额升序排序
print(df.sort_values(['贷款期限','贷款金额'],ascending=[False,True]))
#排序:先对贷款期限降序排序,对贷款期限相同的数据,再对贷款金额升序排序

#5.分组
#对不同的还款状态进行分组
g1=df.groupby('还款状态')
print(g1.groups)

#6.聚合函数 .agg
#按照还款状态进行分组,求各分组贷款金额的平均值
#分组
g1=df.groupby('还款状态')
#各分组贷款金额的平均值
print(g1.agg(np.mean)['贷款金额'])

#7.数据的修改 :映射
data={'name':['Sam','Amy','Tom'],'age':[19,20,16],'sex':['M','F','M'],'score':[78,95,45]}
df1=pd.DataFrame(data,index=['a','b','c'])
print(df1)
#(1)将所有的age+1
#df1['age']=df1['age']+1
df1['age']=df1['age'].map(lambda x:x+1)  #借助匿名函数
print(df1)

#(2)添加一列 level:数据根据score  0-60:差  60-80:中  80-100:优
#自定义函数
def fn(x):
    if x>=0 and x <60:
        return '差'
    elif x>=60 and x <80:
        return '中'
    else:
        return '优'
df1['level']=df1['score'].map(fn)  #只写函数名
print(df1)

#(3)将sex M->男  F->女  借助字典
df1['sex']=df1['sex'].map({'M':'男','F':'女'})
print(df1)

6. pandas总结

(一)
1. 创建一维系列的方法:pd.Series(data, index)
列表(list)  data=[ ]
数组(array) data=numpy.array( )
字典(dict)  data={'a':1,'b':3}   key(关键字):下标(目录)  value():数据
常数列    data=5
index=[ ] 必须是列表的形式
2.获取数据:
获取元素5    s4['c']  or  s4[2]3个数据   s4[:'c']  or  s4[:3]
获取多条数据:s4[['a','c']] 传入一个下标list
(二)
1.创建二维数据帧的方法:pd.DataFrame(data1,index,columns)
  用列表(list)   data1=[['Sam',20,90],['Tom',18,88],['Mary',21,92]]
  用系列(Series) 
  用字典(dict)
  index=[ ]    添加横轴标签
  columns=[ ]  添加纵轴标签
2.列操作:
(1)查看列: df2['name']1列)  df2[['name','MathS']] (多列)
(2)添加列: df2['新列名']3)删除列: del df2['列名']
                   df2.drop(labels=['列名'],axis=1,inplace=True)
             注意:inplase = Ture,则在原来的数据帧进行删除
                   inplase = False,则不是在原来的数据帧进行删除
    则返回一个删除后的副本,不改变原来的数据帧
3.行操作:
(1)查看行:df2.loc['b']  按照样本(横轴)名称查找
        df2.iloc[1]  按照下标(索引)序号查找,从 0开始
(2)添加行:用字典先生成需要添加的一列或几列,再df2=df2.append(dfN)3)删除行:df2.drop(labels=['行名'],axis=0,inplace=True)
(四)缺失值:NaN : not a number(这个位置数据空缺)
1.df.isnull() :是空(无数据)返回 Ture,不是空(有数据)返回False
2.df.notnull() :不是空(有数据)返回 Ture,是空(无数据)返回False
3.df.isnull().sum():查看缺失值的数量
4.df.fillna( ):填充缺失值
5.df.dropna():删除缺失值所在的行
6.df.info():返回数据帧所有的信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 4 columns):
name     3 non-null object
age      2 non-null float64
sex      3 non-null object
score    2 non-null float64
dtypes: float64(2), object(2)
memory usage: 176.0+ bytes
7.df.describe():查看数据的描述
count   (样本数)
mean   (平均值)
std     (标准差)
min    (最小值)
25%    (从小到大排序,位于1/4位置的数)
50%    (中位数)
75%    (从小到大排序,位于3/4位置的数)
max    (最大值)
(五)统计相关函数
   1.  .sum( )  求和
   2.  .count( ) 样本数
   3.  .value_counts( ) 频数(数据相同的有多少个数)
   4.  sort_values([‘列名’], ascending=[True,False] )  True:升序  False:降序
   5.  .groupby( )  分组
   6.  .agg( )  聚合
   7.  .map( )  映射

7. pandas练习

练习1:

import pandas as pd
import numpy as np
# 1.读取名为HeightWeight.csv的文件:
pr=pd.read_csv(r'heightweight.csv')
# (1)查看前10行的数据
print(pr.head(10))
# (2)查看前7行的数据
print(pr.head(7))
# (3)查询特征Height(cm)=166.0的信息
print(pr[pr['Height(cm)']==166])
# (4)查询特征 Sex=0,Height(cm)=167.0的信息
print(pr[(pr['Sex']==0) & (pr['Height(cm)']==167.0)])
# (5)查询身高 170.0--175.0 之间的信息
print(pr[(pr['Height(cm)']>=170) & (pr['Height(cm)']<=175)])
print(pr[pr['Height(cm)'].between(left=170,right=175)])
# 2.读取名为测试.csv的文件,将第三行设为标题行,并将标题行的名字改为 Sex name age
pp=pd.read_csv(r'测试.csv',header=2,delimiter=':',names=['sex','name','age'])
print(pp)
# 3.读取销售情况统计表.xlsx中的第二个子表
ppp=pd.read_excel(r'销售情况统计表.xlsx',sheet_name='1903A')
print(ppp)

练习2:

import pandas as pd
import numpy as np
# 4.创建如下图所示的数据帧
data2={
    'name':['Tom','Mary','Sam'],
    'age':[22.0,np.NaN,18.0],
    'sex':['m','f','m']

}
ffpp=pd.DataFrame(data2)
print(ffpp)
# (1)查看当前数据是否为NaN
print(ffpp.isnull())
# (2)在特征age下,是否有数据为空,并输出空的行
print(ffpp['age'].isnull())

# (3)在特征age下,输出非空的行
print(ffpp[ffpp['age'].isnull()])
# (4)统计每个特征缺失值的数量
print(ffpp.isnull().sum())

# (5)将缺失值的地方数据填充为24
print(ffpp.fillna(24))
# (6)删除有缺失值的地方所在的那一行

print(ffpp.dropna(axis=0,how='any',inplace=False))
# (7)查看数据帧的所有信息
print(ffpp.info)
# (8)查看数据的描述
print(ffpp.describe())

练习3:

import pandas as pd
import numpy as np
# 5.加载 loans.xls 数据集
pa=pd.read_excel(r'..\pandas代码\loans.xls')
print(pa)
# (1)统计贷款号的样本数
print(pa['贷款号'].count())
print(pa.count()['贷款号'])
print(pa['贷款号'].sum())
# print(pa.groupby('贷款号').sum())
# (2)统计贷款金额的总和
print(pa['贷款金额'].sum())
# (3)统计每月归还额的平均数
print(pa['每月归还额'].mean())

练习4:

import pandas as pd
# 1.创建如上图所示的数据帧
# 方法一
data={
    'Name':['Ella','Leo','Mark','Lily'],
    'Sex':['f','m','m','f'],
    'MScore':[99,88,92,85]
}
# 方法二
# data=[{'Name':'Ella','sex':'f','Mscore':99},
# {'Name':'Leo','sex':'m','Mscore':88},
# {'Name':'Mark','sex':'m','Mscore':92},
# {'Name':'MScore','sex':'f','Mscore':85}
# ]
dataframe=pd.DataFrame(data,['a','b','c','d'])
print(dataframe)
# 2.查看 Name 列数据
# print(dataframe.columns)
print(dataframe['Name'])
# d=dataframe.drop(labels=['Name'],axis=1)
# print(d)
# 3.查看 Leo 所在行的数据
# print(dataframe.iloc[1])
print(dataframe.loc['b'])
# 4.添加一列 Cscore ,其中数据为 95,86,91,88
p=dataframe['Cscore']=[95,86,91,88]
print(dataframe)
# 5.添加一列Sum ,其中数据等于Mscore这一列数据加上Cscore列数据
dataframe['Sum']=dataframe['MScore']+dataframe['Cscore']
print(dataframe)
# 6.对Sum这一列进行升序排序
print(dataframe.sort_values('Sum'))
# 7.统计Sum列的平均值并输出
print(dataframe['Sum'].mean())
# 8.统计Sum列的最大值并输出
print(dataframe['Sum'].max())
# 9.删除 Sex 列
del dataframe['Sex']
# dataframe.drop('Sex')
print(dataframe)
# 10.查看当前数据帧是否有缺失值
print(dataframe.isnull())
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞龙程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值