Pandas基础

1、Series1

import pandas as pd
#Series
s1 = pd.Series([5,17,3,26,31])#结果为索引+值
s1.values#获得所有值
s1.index#返回索引
s1[2]#返回第一个元素的值
s1[1:3]#返回第二个和第三个索引+值
s1 = pd.Series([5,17,3,26,31],index=["a","d","b","c","e"])#可以自定义索引(标签索引),标签索引也可以为数字
s1["a"]
s1["d":"c"]#注意标签索引包含结束值!!!
s1["a","e","c"]#任意选择索引
#为了区分标签索引和位置索引,使用loc和iloc区分
s2 = pd.Series([5,17,3,26,31],index=[1,3,5,7,9])
s2.loc[1:3]#标签索引
s2.iloc[1:3]#位置索引
#用字典创建Series
s3 = pd.Series({"青菜":4.1,"白萝卜":2.2,"西红柿":5.3,"土豆":3.7,"黄瓜":6.8})
"青菜" in s3#判断某个标签是否在Series中
s3.loc["青菜"] = 4.5#修改Series里的值(按照标签索引)
s3.iloc[0] = 4.5#修改Series里的值(按照位置索引)
s3[s3 > 5]#根据条件筛选Series元素,可以利用& | ~来进行复杂筛选条件

Series练习1

#1、写出导入pandas的语句,并且给pandas别名为pd
import pandas as pd
#2、创建一个叫s1的Series,里面包含元素-1.2、3.7、2.5、-8.2、6.3。创建后进行输出。
s1 = pd.Series([-1.2,3.7,2.5,-8.2,6.3])
#3、打印s1的所有索引以及所有元素值
s1.values
s1.index
#4、创建一个叫s2的Series,里面包含元素1、2、3、4、5,并且对应索引5、4、3、2、1。创建后进行输出。
s2 = pd.Series([1,2,3,4,5],index=[5,4,3,2,1])
#5、输出s2里按位置顺序排在第2个的元素
s2.iloc[1]
#6、输出s2里按标签对应从5到3(包括3)范围内的元素。
s2.loc[5:3]
#7、通过一个字典来创建Series s3。字典的键为:小李、小陈、小张、小曾、小邓,值为82、93、91、78、68。创建后进行输出。
s3 = pd.Series({"小李":82,"小陈":93,"小张":91,"小曾":78,"小邓":68})
#8、把s3里小张标签对应的值改为95,再输出s3。
s3.loc["小张"] = 95
#9、输出s3里所有值大于80且小于90的元素。
s3[(s3 > 80)&(s3 < 90)]

2、Series2

#Series续篇
import pandas as pd
s1 = pd.Series([1,4,2,3,5],index=[1,3,5,7,9])
s2 = pd.Series([8,1,7,3,9],index=[1,2,3,5,10])
s1 + s2#索引相同的位置相加,若没找到对应相等的索引则返回NaN
#若不想输出NaN,则可以用add()、sub()、mul()、div()方法将找不到对应位置的索引值变为0,也就是s1中的值+0
s1.add(s2,fill_value=0)#加
s1.sub(s2,fill_value=0)#减
s1.mul(s2,fill_value=1)#乘
s1.div(s2,fill_value=1)#除
print(s1.max())
print(s1.min())
print(s1.sum())
print(s1.mean())
s1.describe()#会返回Series中的很多信息,如:个数、平均值、标准差、最小值、最大值、中位数等
#对元素分别操作,利用apply(函数名)方法,apply方法不改变scores这个Series
scores = pd.Series({"小明":92,"小红":67,"小杰":70,"小丽":88,"小华":76})
def get_grade_from_score(score):
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    else:
        return "D"
grades = scores.apply(get_grade_from_score)
squared_scores = scores.apply(lambda x:x*x)#利用匿名函数

Series练习2

#1、创建s1,包含[92,67,70,88,76]及对应索引["小明","小红","小杰","小丽","小华"]。创建s2,包含元素[95,85,60,79,76]及对应索引
#["小明","小杰","小宇","小娟","小彤"]。创建后打印s1和s2。
import pandas as pd
s1 = pd.Series([92,67,70,88,76],index=["小明","小红","小杰","小丽","小华"])
s2 = pd.Series([95,85,60,79,76],index=["小明","小杰","小宇","小娟","小彤"])
#2、让s1和s2的相同索引元素之间进行相加,若无法找到对应索引的值则将缺失值用0代替。
s1.add(s2,fill_value=0)
#3、输出s1的统计学相关数据,包括最大值、最小值、平均值、标准差。
s1.describe()
#4、把s1更新为所有数字加5后的结果,并进行输出。
s1 = s1+5
#5、根据以下规则,输出一个新的Series,包含s1里各个学生成绩所对应的等级。
#A:90分及以上  B:80分及以上-90分  C:70分及以上-80分  D:60分及以上-70分  不及格:60分以下
def s_grade(score):
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    elif score >= 60:
        return "D"
    else:
        return "不及格"
s3 = s1.apply(s_grade)
s3

3、DataFrame1

#Dataframe(表格),就是由Series组成的字典
#创建DataFrame
#法一:
s_id = pd.Series(["01","02","03","04","05"])
s_class = pd.Series(["二班","一班","二班","三班","一班"])
s_grade = pd.Series([92,67,70,88,76])
df1 = pd.DataFrame({"学号":s_id,"班级":s_class,"成绩":s_grade})#生成一个二维表
#法二(嵌套字典):
df2 = pd.DataFrame({"学号":{"小明":"01","小红":"02","小杰":"03","小丽":"04","小华":"05"},
                    "班级":{"小明":"二班","小红":"一班","小杰":"二班","小丽":"三班","小华":"一班"},
                    "成绩":{"小明":"92","小红":"67","小杰":"70","小丽":"88","小华":"76"}})
#获得DataFrame的索引和列名
df2.index#获得索引
df2.columns#获得属性
df2.values#获得值,返回numpy数组
#对DataFrame进行转置
df2.T
#提取DataFrame的列
df2["班级"]
df2.班级#若属性名带有空格或特殊符号时,必须用df2[]提取
#提取DataFrame里任意列(注意是两个中括号)
df2[["学号","成绩"]]
#提取DataFrame里的行
df2.loc["小丽"]#根据标签索引
df2.iloc[3]#根据位置索引
#提取DataFrame里的部分行
df2.loc["小红":"小丽"]#包含结束值
df2.iloc[1:3]
#提取任意行
df2.loc[["小红","小丽"]]
df2.iloc[[3,1]]
#提取某个DataFrame元素
df2.loc["小杰","学号"]#第一个表示行,第二个表示列
df2.iloc[2,0]
#提取部分DataFrame
df2.loc["小红":"小杰","班级":"成绩"]#第一部分切片表示行,第二部分表示对应的列
df2.iloc[1:3,1:3]
df2.loc[:,"班级":"成绩"]#返回全部的行(班级和成绩两列)
df2.iloc[:,1:3]
df2.loc[["小红","小丽"],"学号":"班级"]#提取不相邻的行或列
df2.iloc[[1,3],0:2]
#根据条件筛选DataFrame的行
df2[df2["成绩"] > 80]
df2[(df2["成绩"]>80)&(df2["班级"]=="三班")]
#获得DataFrame的前N行
df2.head()#默认提取前5行
df2.head(2)#提取前两行

DataFrame练习1

#1、创建一个叫name的Series,里面包含字符串元素"小陈","小李","小王","小张","小赵","小周",标签为"001","002","003","004","005","006"。
#创建一个叫gender的Series,里面包含字符串元素"女","女","男","男","女","男",标签为"006","005","004","003","002","001"。
#创建一个叫height的Series,里面包含浮点数元素172.5,168.0,178.2,181.3,161.7,标签为"001","002","003","004","005"。
import pandas as pd
name = pd.Series({"001":"小陈","002":"小李","003":"小王","004":"小张","005":"小赵","006":"小周"})
gender = pd.Series({"006":"女","005":"女","004":"男","003":"男","002":"女","001":"男"})
height = pd.Series({"001":172.5,"002":168.0,"003":178.2,"004":181.3,"005":161.7})
#2、创建一个叫students的DataFrame,包含列名姓名、性别、身高,数据分别为对应创建好的name、gender、以及height这三个Series。输出创建好的students。
students = pd.DataFrame({"姓名":name,"性别":gender,"身高":height})
students
#3、打印students所有索引和列名。
students.index
students.columns
#4、输出把students的行和列进行转置后的结果。
students.T
#5、输出students的身高列。
students["身高"]
#6、输出students的性别和身高列。
students[["性别","身高"]]
#7、输出students索引为003的行。
students.loc["003"]
#8、输出students索引为003、004、005的行。
students.loc["003":"005"]
#9、输出students里索引为005的身高。
students.loc["005","身高"]
#10、输出students索引为003、005的数据的姓名和身高。
students.loc[["003","005"],"姓名":"身高"]
#11、输出students索引为003、005的数据的所有变量。
students.loc[["003","005"],:]
#12、输出students里身高大于165的女性。
students[(students["身高"]>165)&(students["性别"]=="女")]
#13、通过head方法,输出students的前5行数据。
students.head()

4、DataFrame2

import pandas as pd
name = pd.Series({"001":"小陈","002":"小李","003":"小王","004":"小张","005":"小赵","006":"小周"})
gender = pd.Series({"006":"女","005":"女","004":"男","003":"男","002":"女","001":"男"})
height = pd.Series({"001":172.5,"002":168.0,"003":178.2,"004":181.3,"005":161.7,"006":159.8})
grade = pd.Series({"001":89,"002":92,"003":82,"004":96,"005":93,"006":84})
df1 = pd.DataFrame({"姓名":name,"性别":gender,"身高":height,"成绩":grade})
#更新Datadf1Frame的一列值
df1["成绩"] = pd.Series([90,91,83,95,94,85],index=["001","002","003","004","005","006"])#标签要和原本表的标签对应
df1["成绩"] = [90,91,83,95,94,85]
#给DataFrame增加一列值
df1["班级"] = ["一班","三班","二班","三班","一班","二班"]
#更新DataFrame的一行值(只能用loc不能用iloc)
df1.loc["005"] = pd.Series(["小赵","女",162.7,95,"一班"],index=["姓名","性别","身高","成绩","班级"])
df1.loc["005"] = ["小赵","女",162.7,95,"一班"]
#删除DataFrame的行
df1 = df1.drop(["003","006"])
#删除DataFrame的列(axis=0(默认)表示沿着列明纵向进行操作,删除行,注意前一个参数是行标签,axis=1表示沿着列名横向进行操作,删除列,前一个参数是列名)
df1.drop("姓名",axis=1)
df1.drop(["身高","性别"],axis=1)#一次性删除多列
#DataFrame和DataFrame操作
df1.add(df2,fill_Value=0)
df1.sub(df2,fill_value=0)
df1.div(df2,fill_value=0)
df1.mul(df2,fill_value=0)
#广播机制(改变原来的表)
df1[["姓名","性别"]]*5

DataFrame练习2

#1、创建一个名为students的DataFrame。要求索引为学号(001、002等),列名为姓名、考试1、考试2、考试3,并输出创建好的DataFrame。
import pandas as pd
students = pd.DataFrame({"001":{"姓名":"小陈","考试1":85,"考试2":95,"考试3":92},"002":{"姓名":"小李","考试1":91,"考试2":92,"考试3":94},
                        "003":{"姓名":"小王","考试1":86,"考试2":81,"考试3":89},"004":{"姓名":"小张","考试1":79,"考试2":89,"考试3":95},
                       "005":{"姓名":"小赵","考试1":96,"考试2":91,"考试3":91},"006":{"姓名":"小周","考试1":81,"考试2":81,"考试3":92}})
students = students.T
#2、给students增加一列考试4,数据依次为:[72,69,79,83,82,76]。
#students["考试4"] = pd.Series([72,69,79,83,82,76],index=["001","002","003","004","005","006"])
students["考试4"] = [72,69,79,83,82,76]
#3、给students添加一行,索引为007,数据为:“小杨”,79,82,81,69。
students.loc["007"] = pd.Series(["小杨",79,82,81,69],index=["姓名","考试1","考试2","考试3","考试4"])
students.loc["007"] = ["小杨",79,82,81,69]
#4、输出students删除索引为006、007的结果,但不要改变students本身。
#students.drop(["006","007"],axis=0)
#5、输出students删除列名为"考试2"、"考试4"的结果,但不要改变students本身。
#students.drop(["考试2","考试4"],axis=1)
#6、创建一个Series bonus,包含的值和值对应的索引分别为:{"考试1":2,"考试2":3,"考试3":2,"考试4":5}。输出这个Series与students里所有分数列相加后
#的结果,但不要更新students。
bonus = pd.Series({"考试1":2,"考试2":3,"考试3":2,"考试4":5})
bonus + students[["考试1","考试2","考试3","考试4"]]
#7、更新students的考试4,让每项数据值增加10,并输出更新后的结果。
students["考试4"] = students["考试4"] + 10
students

5、DataFrame3

import pandas as pd
students = pd.DataFrame({"001":{"考试1":85,"考试2":95,"考试3":92},"002":{"考试1":91,"考试2":92,"考试3":94},
                        "003":{"考试1":86,"考试2":81,"考试3":89},"004":{"考试1":79,"考试2":89,"考试3":95},
                       "005":{"考试1":96,"考试2":91,"考试3":91},"006":{"考试1":81,"考试2":81,"考试3":92}})
students = students.T
#求各种值
students.mean()#求每行的平均值
students.mean(axis=1)#求每列的平均值
#对DataFrame的行或列操作
#对行和列的操作,去掉一个最低分去掉一个最高分,求平均
def trim_mean(data):
    data_len = len(data)
    data_sum = data.sum()
    max_num = data.max()
    min_num = data.min()
    return (data_sum - max_num - min_num)/(data_len - 2)
students.apply(trim_mean)#axis=0,对列求平均(默认)
students.apply(trim_mean,axis=1)#axis=1,对行求平均
#对DataFrame的每个元素操作
students.applymap(lambda x:x + 5)#注意该函数计算时不能包含非数字列,因此应该先提取出来数字列
#DataFrame的describe方法(返回每一列的信息,而且会自动忽略非数字列)
students.describe()

DataFrame练习3

import pandas as pd
import numpy as np
students = pd.DataFrame({"001":{"姓名":"小陈","考试1":85,"考试2":95,"考试3":92},"002":{"姓名":"小李","考试1":91,"考试2":92,"考试3":94},
                        "003":{"姓名":"小王","考试1":86,"考试2":81,"考试3":89},"004":{"姓名":"小张","考试1":79,"考试2":89,"考试3":95},
                       "005":{"姓名":"小赵","考试1":96,"考试2":91,"考试3":91},"006":{"姓名":"小周","考试1":81,"考试2":81,"考试3":92}})
students = students.T
#1、创建一个叫student average的DataFrame,索引为学号,包含姓名列(列名为“姓名”),以及计算出三次考试平均值后的结果列(列名为“平均分”)。
average = students.loc[:,"考试1":"考试3"].mean(axis=1)
name = students["姓名"]
student_average = pd.DataFrame({"姓名":name,"平均分":average})
student_average
#2、输出每次考试第二高的分数组成的Series,可以尝试结合匿名函数。
students.loc[:,"考试1":"考试3"].apply(lambda x : np.sort(x)[-2])
#3、根据一下规则,输出每个学号对应的三次考试的成绩:
#A+:平均分>=95  A:90<=平均分<95  B+:85<=平均分<80  B:80<=平均分<85  C+:75<=平均分<80  C:平均分<75
def average_students(average):
    if average >= 95:
        return "A+"
    elif average >= 90:
        return "A"
    elif average >= 85:
        return "B+"
    elif average >= 80:
        return "B"
    elif average >= 75:
        return "C+"
    else:
        return "C"
students.loc[:,"考试1":"考试3"].applymap(average_students)
#4、展示students每个考试分数数据列的统计信息,包括个数、平均值、标准差、四分位数等。
students["考试1"] = students["考试1"].astype('int')#astype()方法用于类型转换
students["考试2"] = students["考试2"].astype('int')
students["考试3"] = students["考试3"].astype('int')
students.describe()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值