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)
全部评论

相关推荐

吴offer选手:HR:我KPI到手了就行,合不合适关我什么事
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务