Pandas的数据结构--DataFrame

# DataFrame 是一个表格型数据结构,可以看做是由Series组成的字典
# 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












猜你喜欢

转载自blog.csdn.net/qq_42034590/article/details/80716850