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)

猜你喜欢

转载自blog.csdn.net/xiao_pingping/article/details/82079754