Pandas的数据结构之DataFrame
DataFrame的简介
DataFrame是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(共用一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,
也有列索引。行索引:index。列索引:columns。值:values(numpy的二维数组)。
from pandas import DataFrame
import pandas as pd
import numpy as np
df = pd.read_csv("winequality-red.csv") # .csv文件在当前目录下
print(df)
print(df.index, "\n", df.columns, "\n", df.values, "\n", df.values.shape)
# 1.DataFrame的创建
''' 最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组) 作为每一列。此外,DataFrame会自动加上每一行的索引,(和Series一样)。 同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。 '''
df1 = DataFrame({
"height": [175, 180, 167, 188], "age": np.random.randint(15, 24, size=4),"gender": ["男", "女", "男", "女"]}, index=["张 三", "韩梅梅", "王 五", "马冬梅"],columns=["height", "age", "gender", "weight"])
print(df1)
# DataFrame属性:values、columns、index、shape
print(df1.shape)
''' 练习:根据以下考试成绩表,创建一个DataFrame,命名为df: 张三 李四 语文 150 0 数学 150 0 英语 150 0 理综 300 0 '''
df = DataFrame({
"张三": [150, 150, 150, 300], "李四": [0, 0, 0, 0]},
index=["语文", "数学", "英语", "理综"])
print(df)
# 2.DataFrame的索引
''' (1)对列进行索引 1)通过类似字典的方式 2)通过属性的方式 可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经 设置好了,就是相应的内容。 '''
df = DataFrame({
"height": [175, 180, 167, 188], "age": np.random.randint(15, 24, size=4),"gender": ["男", "女", "男", "女"], "weight":[65, 42, 56, 65]}, index=["张 三", "韩梅梅", "王 五", "马冬梅"],columns=["height", "age", "gender", "weight"])
print(df)
# 使用类似字典的方式进行索引。检索列返回值,是一个Series
print(df["age"])
print(type(df["age"]))
# 使用属性的方式进行索引。对于DataFrame,列名,就相当于属性,DataFrame是统计数据时,用的表格
# 某一事物的属性,每一个属性对应DataFrame中的列名
print(df.weight)
''' (2)对行进行索引 1)使用.ix[]来进行索引 2)使用.loc[]加index来进行行索引 3)使用.iloc[]加整数来进行索引 同样返回一个Series,index为原来的columns。 '''
# 对于行的检索,返回值,也是Series
print(df.loc["韩梅梅"])
# 如果检索多行,返回的数据是DataFrame
print(df.loc[["韩梅梅", "马冬梅"]])
# 对于切片而言,没有列切片,列是属性
print(df.loc["张 三": "王 五"])
# 隐式索引 左闭右开
print(df.iloc[0:2])
# DataFrame自身有bug,索引是汉字,有时无法显示索引结果
''' 对元素索引的方法 ---使用列索引 ---使用行索引(iloc[3,1]相当于两个参数;iloc[[3,3]]里面的[3,3]看做一个参数) ---使用values属性(二维numpy数组) '''
print(df["age"]["韩梅梅"])
# df["age"]["韩梅梅"] = 18
# print(df)
# 检索行时,参数可以多个,但是列无法完成这样的操作
print(df.loc["马冬梅"]["weight"])
print(df.loc["王 五", "weight"])
# 使用values属性
print(df.values[0, 1])
'''**************注意:直接使用中括号时:索引表示的是列索引,切片表示的是行切片***************'''
# 3.DataFrame的运算
''' (1)DataFrame之间的运算与Series一样: ----在运算中自动对齐不同索引的数据 ----如果索引不对应,则补NaN '''
# 创建DataFrame df1 不同人员的各科目成绩,月考一
df1 = DataFrame(np.random.randint(0, 150, size=(4, 4)), index=["张三", "李四", "王五", "刘六"], columns=["语文", "数学", "英语", "Python"])
print(df1)
# 创建DataFrame df2 不同人员的各科目成绩,月考二,有新学生转入
df2 = DataFrame(np.random.randint(0, 150, size=(5, 4)), index=["张三", "李四", "王五", "刘六", "老王"], columns=["语文", "数学", "英语", "Python"])
print(df2)
# 求月考一盒月考二的和
print(df1 + df2)
# 通过这种方式避免数据相加时出现NaN的情况
print(df1.add(df2, fill_value=0))
''' (2)Series与DataFrame之间的运算【重要】 --使用Python操作符:以行为单位操作(参数必须相同),对所有行有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN) --使用pandas操作函数: axis=0:以列为单位操作(参数必须是列),对所有列都有效。 axis=1:以行为单位操作(参数必须是行),对所有行都有效。 '''
s1 = df2["Python"] # 提取一列
print(df2 + s1)
print(df1.columns, s1.index) # 数据类型不一致
s2 = df2.loc["老王"] # 提取一行
print(df2 + s2) # 广播机制
print(df2.columns, s2.index)
# axis=0(0==index 行):以列为单位操作(参数必须是列),对所有列都有效。
# axis=1(1==columns 列):以行为单位操作(参数必须是行),对所有行都有效。
s3 = df2.loc["张三"] # 取出一行
print(s3)
print(df2.add(s3))
# axis:index,columns,0,1-->>0==index;1==columns
print(df2["语文"])
''' 输出结果为: 张三 52 李四 26 王五 113 刘六 95 老王 0 Name: 语文, dtype: int32 取出的是列的数据,但是需要进行相加时,是进行的是行操作'''
'''练习1:假设df3是期中考试成绩,df4是期末考试成绩,请自由创建df4,并将其与df3相加,求期中期末平均值。'''
# 使用reshape函数变形,注意参数是一个tuple元组类型
df3 = DataFrame(np.random.randint(0, 150, size=16).reshape((4, 4)), columns=["Java", "C++", "Python", "PHP"], index=["林雪", "张子涵", "李子欣", "黄梓琳"])
print(df3)
df4 = DataFrame(np.random.randint(0, 150, size=16).reshape((4, 4)), columns=["Java", "C++", "Python", "PHP"], index=["林雪", "张子涵", "李子欣", "黄梓琳"])
print(df4)
# 求平均值
print("*********各位同学的期中期末平均值如下所示*********")
print((df3+df4)/2)
print(df3.add(df4, fill_value=0)/2)
''' 练习2:假设张子涵期中考试Java被发现作弊,要记为0分,如何实现? '''
df4.loc["张子涵"]["Java"] = 0 # df2["Java"]["张子涵"] = 0
print(df4)
''' 练习3:林雪因为举报张子涵作弊立功,期中考试所有科目加100分,如何实现? '''
df4.loc["林雪"] += 100
print(df4)
''' 练习4:后来老师发现有一道题目出错了,为了安抚学费的情绪,给每位同学每个科目都加10分,如何实现? '''
df5 = (df4 + 10)
print(df5)