# DataFrame 是一个表格型数据结构,可以看做是由Series组成的字典
# DataFrame 是按一定顺序排列的多项数据组成的,
# 设计的初衷是为了将Series的使用场景从一维拓展到多维,所有DataFrame既有行索引,又有列索引
# 行索引:index
# 列索引:columns
#可以给Df传递一个字典创建
#DF以字典的键作为每一列的名称
#以字典的值作为每一列
#使用python操作符:以行为单位操作(参数必须是行),对所有行都有效果
#使用pandas操作函数:
# axis = 0: 以列为单位操作,对所有列都有效
#1,假设score1是期中考试成绩,score2是期末考试成绩
# 请自行创建score2,并将其与score1相加,
# DataFrame 是按一定顺序排列的多项数据组成的,
# 设计的初衷是为了将Series的使用场景从一维拓展到多维,所有DataFrame既有行索引,又有列索引
# 行索引:index
# 列索引:columns
# 值:values(numpy中的二维数组)
import numpy as np import pandas as pd from pandas import Series,DataFrame
data = np.random.randint(0,100,size=(5,5)) index = ['xiaoming','xiaobai','xiaohei','xiaohuang','xiaohong'] columns = ['python','c','java','js','go'] df1 = DataFrame(data=data,index=index,columns=columns) df1
dic = { 'python':[90,20,31,40,32], 'c':[49,34,56,89,45], 'java':[98,90,50,60,70], 'js':[89,43,56,45,67], 'go':[98,95,60,70,90], } df2 = DataFrame(data=dic) df2.index=['dancer','mery','tom','jack','rose'] df2#DataFrame的创建
#可以给Df传递一个字典创建
#DF以字典的键作为每一列的名称
#以字典的值作为每一列
#如果传入的列和字典键不匹配,则相应值为NaN
data = np.random.randint(0,100,size=(5,5)) index = ['xiaobai','xiao','xiaomi','xiaohua','xiaoke'] columns = ['python','c','java','go','php'] #行代表的就是数据样本,对象 #列代表数据的属性,特征 df1 = DataFrame(data=data, index=index, columns=columns) df1
df1.values df1.index df1.columns # index/columns 都可以赋值 # values是只读的,不能赋值 value = np.random.randint(100,200,size=(5,5)) df1.values = value df1 df1.shape
#练习 创建一个DataFrame,命名为df: 张三 李四 语文 150 0 数学 150 0 英语 150 0 理综 150 0
data = np.array([[150,0],[150,0],[150,0],[150,0]]) index = ['yuwen','shuxue','yingyu','lizong'] columns = ['zhangsan','lisi'] df = DataFrame(data=data,index=index,columns=columns) df #字典 dic = { 'zhangsan':[150,150,150,150], 'lisi':[0,0,0,0] } df1 = DataFrame(data=dic,index=index) df1
dic = { 'name':['he','she','to','jack'], 'age':[12,13,45,67], 'addr':['bj','tj','sh','wh'] } df = DataFrame(data=dic) df
df['addr'] df.name[1] df.loc[1]['name'] #获取索引为1的行和索引为2对应的值 df.iloc[1,2] #获取多行 索引为1和2的行 df.iloc[[1,2]] #获取多行 df[['addr','name']]
#获取一列 df[列标签] #获取多列 df[列标签1,列标签2] #获取一行 df.loc[行标签] #获取多行 df.loc[[行标签1,行标签2]] #获取元素 df.loc[行标签,列标签]
切片
#行索引 df[0:2] df.iloc[0:2] #列切片 df.loc[:,'addr':'name'] df.iloc[:,:] #注意:直接用中括号时: #索引表示列索引 #切片表示行切片
data = np.random.randint(0,150,size=(5,5)) index = list('ABCDE') columns = ['python','java','c','php','go'] df = DataFrame(data=data,index=index,columns=columns) df
df[['java','c']] df.loc[:,'java':'c'] df.iloc[:,1:3] df.loc['B':'C'] df['B':'C'] df.iloc[1:3] df.loc[['B','C']] df['java']['A'] df.loc['A']['java'] df.loc['A','java'] df['php'] df.php df.loc['B'] df.iloc[1] df.loc['B':'B']
DataFrame的运算
#DataFrame的运算和Series一样 #在运算中自动对齐相同索引的数据 #如果索引对不齐,则补NaN
data = np.random.randint(0,100,size=(5,5)) index = list('ABCDE') columns = list('甲乙丙丁戊') df1 = DataFrame(data=data,index=index,columns=columns) df1 data2 = np.random.randint(100,200,size=(3,3)) index2 = list('ABC') columns2= list('甲乙丙') df2 = DataFrame(data=data2,index=index2,columns=columns2) df2
df1 + df2 df1.add(df2,fill_value=0)#Series与DataFrame之间的运算
#使用python操作符:以行为单位操作(参数必须是行),对所有行都有效果
#使用pandas操作函数:
# axis = 0: 以列为单位操作,对所有列都有效
# axis = 1: 以行为单位操作,对所有行都有效
s1 = Series(data=np.random.randint(0,100,size=5),index=list('ABCDE')) df1 = DataFrame(data=np.random.randint(0,100,size=(5,5)), index=list('BCDEF'),columns=list('甲乙丙丁戊')) #display(s1,df1) display(s1,df1)
df1 + s1 #fill_value在df和Series之间运算时,不能使用 df1.add(s1,axis=0)#练习:
#1,假设score1是期中考试成绩,score2是期末考试成绩
# 请自行创建score2,并将其与score1相加,
# 求期中期末平均值
score1 = DataFrame(data=np.random.randint(0,100,size=(3,3)), index=['xiaobai','xiaohei','xiaoming'], columns=['python','java','c']) score2 = DataFrame(data=np.random.randint(0,100,size=(3,3)), index=['xiaobai','xiaohei','xiaoming'], columns=['python','java','c']) display(score1,score2) mean = (score1+score2)/2 mean
#2,假如xiaobai期中考试python被发现作弊,得记为0分,如何实现?
score1.loc['xiaobai','python'] = 0 score1#3,xiaohei因为举报xiaobai作弊成功,期中考试所有科目成绩都加100分,如何实现
score1.loc['xiaohei'] += 100 score1
#4,后来老师发现有一道题出错了,为了安抚学生情绪,给每个学生每个科目都加10分(期中)
score1 += 10 score1