Pandas学习之DataFrame

2、DataFrame

2.1 DataFrame的创建
import pandas as pd
import numpy as np
#方式1通过Series直接创建
s1=pd.Series([1,2,3,4,5],[1,2,3,4,5])
s2=pd.Series([6,7,8,9,10],[0,1,2,3,4])
df=pd.DataFrame({"第一列":s1,"第二列":s2})
print(df)
print(type(df))
print(type(df["第一列"]))

第一列 第二列
0 NaN 6.0
1 1.0 7.0
2 2.0 8.0
3 3.0 9.0
4 4.0 10.0
5 5.0 NaN
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.series.Series'>

#方式2通过字典进行创建
df=pd.DataFrame(
    {
        "id":[1,2,3,4,5],
        "name":["Alice","Bob","Clum","Dala","Eve"],
        "age":[18,19,18,17,20],
        "score":[90.1,90.2,80.3,90.0,76]
    },index=[1,2,3,4,5],columns=["name","score","id","age"]
)
#columns用来修改顶栏顺序
df

name score id age
1 Alice 90.1 1 18
2 Bob 90.2 2 19
3 Clum 80.3 3 18
4 Dala 90.0 4 17
5 Eve 76.0 5 20
2.2 DataFrame的属性
print(F"行索引:{df.index}")
print(F"列标签:{df.columns}")
print(F"值:\n{df.values}")
print(F"维度:{df.ndim}")
print(F"形状:{df.shape}")
print(F"元素个数:{df.size}")
print(F"数据类型:\n{df.dtypes}")

行索引:Index([1, 2, 3, 4, 5], dtype='int64')
列标签:Index(['name', 'score', 'id', 'age'], dtype='object')
值:
[['Alice' 90.1 1 18]
['Bob' 90.2 2 19]
['Clum' 80.3 3 18]
['Dala' 90.0 4 17]
['Eve' 76.0 5 20]]
维度:2
形状:(5, 4)
元素个数:20
数据类型:
name object
score float64
id int64
age int64
dtype: object

#转置
print(df.T)

1 2 3 4 5
name Alice Bob Clum Dala Eve
score 90.1 90.2 80.3 90.0 76.0
id 1 2 3 4 5
age 18 19 18 17 20

#获取元素 loc iloc at iat
print(df)
#获取某一行数据
print(df.loc[3:4,:])#显式索引双闭
print(df.iloc[2:5,:])#隐式索引0开头,左开右闭

name score id age
1 Alice 90.1 1 18
2 Bob 90.2 2 19
3 Clum 80.3 3 18
4 Dala 90.0 4 17
5 Eve 76.0 5 20
name score id age
3 Clum 80.3 3 18
4 Dala 90.0 4 17
name score id age
3 Clum 80.3 3 18
4 Dala 90.0 4 17
5 Eve 76.0 5 20

#获取某一列数据
print(df.loc[:,"name":"id"])
print(df.iloc[:,0:3])

name score id
1 Alice 90.1 1
2 Bob 90.2 2
3 Clum 80.3 3
4 Dala 90.0 4
5 Eve 76.0 5
name score id
1 Alice 90.1 1
2 Bob 90.2 2
3 Clum 80.3 3
4 Dala 90.0 4
5 Eve 76.0 5

#获取单个数据
print(df.at[3,"score"])
print(df.iat[2,1])
print(df.loc[3,"score"])
print(df.iloc[2,1])

80.3
80.3
80.3
80.3

2.3 DataFrame数据的访问
#获取单列数据
print(df["score"])
print(df.score)

1 90.1
2 90.2
3 80.3
4 90.0
5 76.0
Name: score, dtype: float64
1 90.1
2 90.2
3 80.3
4 90.0
5 76.0
Name: score, dtype: float64

#获取多列数据
print(df[["score","age"]])

score age
1 90.1 18
2 90.2 19
3 80.3 18
4 90.0 17
5 76.0 20

#获取尾部三个元素
print(df.tail(3))
#head是前n行,和tail都默认5行

name score id age
3 Clum 80.3 3 18
4 Dala 90.0 4 17
5 Eve 76.0 5 20

#获取特定条件的行
print(df[(df.score>85) & (df.age>=18)])

name score id age
1 Alice 90.1 1 18
2 Bob 90.2 2 19

#随机取样n行(默认一行)
print(df.sample(2))

name score id age
4 Dala 90.0 4 17
1 Alice 90.1 1 18

2.4 DataFrame的常用函数
print(df)

name score id age
1 Alice 90.1 1 18
2 Bob 90.2 2 19
3 Clum 80.3 3 18
4 Dala 90.0 4 17
5 Eve 76.0 5 20

#查看元素是否包含在参数集合中
print(df.isin(["Alice",17,90.1,3]))

name score id age
1 True True False False
2 False False False False
3 False False True False
4 False False False True
5 False False False False

#查看元素是否是缺失值
print(df.isna())

name score id age
1 False False False False
2 False False False False
3 False False False False
4 False False False False
5 False False False False

#各种数学函数
print(df.sum(),'\n')
print(df["score"].sum())
print(df.age.mean())
print(df.id.max())
print(df.score.min())
print(F"中位数{df.score.median()}")
print(F"年龄众数{df.age.mode()}")
print(F"成绩方差{df.score.var()}")
print(F"成绩标准差{df.score.std()}")

name AliceBobClumDalaEve
score 426.6
id 15
age 92
dtype: object

426.6
18.4
5
76.0
中位数90.0
年龄众数0 18
Name: age, dtype: int64
成绩方差45.157
成绩标准差6.719895832525977

#直接查看所有描述性信息
df.describe()

score id age
count 5.000000 5.000000 5.000000
mean 85.320000 3.000000 18.400000
std 6.719896 1.581139 1.140175
min 76.000000 1.000000 17.000000
25% 80.300000 2.000000 18.000000
50% 90.000000 3.000000 18.000000
75% 90.100000 4.000000 19.000000
max 90.200000 5.000000 20.000000
#输出每一列非nan值的个数
print(df.count())

#输出相同行出现次数
print(df.value_counts())

name 5
score 5
id 5
age 5
dtype: int64
name score id age
Alice 90.1 1 18 1
Bob 90.2 2 19 1
Clum 80.3 3 18 1
Dala 90.0 4 17 1
Eve 76.0 5 20 1
Name: count, dtype: int64

#检查是否有重复的行
print(df.duplicated())

1 False
2 False
3 False
4 False
5 False
dtype: bool

#若有重复的行可以进行去重
print(df.drop_duplicates())

name score id age
1 Alice 90.1 1 18
2 Bob 90.2 2 19
3 Clum 80.3 3 18
4 Dala 90.0 4 17
5 Eve 76.0 5 20

#检查某一列是否有重复元素
print(df.duplicated(subset="age"))

1 False
2 False
3 True
4 False
5 False
dtype: bool

#将表格中的一个元素替换成另一个
print(df.replace(18,30))

name score id age
1 Alice 90.1 1 30
2 Bob 90.2 2 19
3 Clum 80.3 3 30
4 Dala 90.0 4 17
5 Eve 76.0 5 20

#求累计和(前缀和)
df.cumsum()

name score id age
1 Alice 90.1 1 18
2 AliceBob 180.3 3 37
3 AliceBobClum 260.6 6 55
4 AliceBobClumDala 350.6 10 72
5 AliceBobClumDalaEve 426.6 15 92
#求累计最小值
df.cummin()

name score id age
1 Alice 90.1 1 18
2 Alice 90.1 1 18
3 Alice 80.3 1 18
4 Alice 80.3 1 17
5 Alice 76.0 1 17
#排序
print(df.sort_index(ascending=False))#按照index从大到小排序

name score id age
5 Eve 76.0 5 20
4 Dala 90.0 4 17
3 Clum 80.3 3 18
2 Bob 90.2 2 19
1 Alice 90.1 1 18

#按照score降序排序
print(df.sort_values(by="score",ascending=0))

name score id age
2 Bob 90.2 2 19
1 Alice 90.1 1 18
4 Dala 90.0 4 17
3 Clum 80.3 3 18
5 Eve 76.0 5 20

#按照score降序排序并且年龄从小到大升序排序
print(df.sort_values(by=["score","age"],ascending=[0,1]))

name score id age
2 Bob 90.2 2 19
1 Alice 90.1 1 18
4 Dala 90.0 4 17
3 Clum 80.3 3 18
5 Eve 76.0 5 20

#按照列表里的参数依次排列求最大的n个值
print(df.nlargest(2,columns=["score","age"]))
#求最小
print(df.nsmallest(2,columns=["score","age"]))

name score id age
2 Bob 90.2 2 19
1 Alice 90.1 1 18
name score id age
5 Eve 76.0 5 20
3 Clum 80.3 3 18

2.5 DataFrame经典案例
2.5.1 学生成绩分析

已知某班成绩的数据

求每位学生的平均分与总成绩

找出数学成绩高于90 or 英语成绩高于85的学生

按照总分从高到低排序,并且输出前三名

data={
    "姓名":["张三","李四","王五","赵六","钱七"],
    "数学":[68,90,66,98,80],
    "英语":[80,90,60,78,91],
    "语文":[75,80,88,85,90]
}
scores=pd.DataFrame(data)
print(scores)

姓名 数学 英语 语文
0 张三 68 80 75
1 李四 90 90 80
2 王五 66 60 88
3 赵六 98 78 85
4 钱七 80 91 90

#求每位学生的平均分与总成绩

#axis等于1代表横着计算,等于0则代表竖着计算
scores["总分"]=scores[["数学","英语","语文"]].sum(axis=1)
scores["平均分"]=scores["总分"]/3
scores

姓名 数学 英语 语文 总分 平均分
0 张三 68 80 75 223 74.333333
1 李四 90 90 80 260 86.666667
2 王五 66 60 88 214 71.333333
3 赵六 98 78 85 261 87.000000
4 钱七 80 91 90 261 87.000000
#找出数学成绩高于90 or 英语成绩高于85的学生
scores[(scores["数学"]>90)|(scores["英语"]>85)]

姓名 数学 英语 语文 总分 平均分
1 李四 90 90 80 260 86.666667
3 赵六 98 78 85 261 87.000000
4 钱七 80 91 90 261 87.000000
#按照总分从高到低排序,并且输出前三名
scores.sort_values(by="总分",ascending=0).head(3)

姓名 数学 英语 语文 总分 平均分
4 钱七 80 91 90 261 87.000000
3 赵六 98 78 85 261 87.000000
1 李四 90 90 80 260 86.666667
#另一种方法
scores.nlargest(3,"总分")

姓名 数学 英语 语文 总分 平均分
3 赵六 98 78 85 261 87.000000
4 钱七 80 91 90 261 87.000000
1 李四 90 90 80 260 86.666667
2.5.2 销售数据分析

已知各个产品的销售单价与销量

计算每种产品的总销售额

找出销售额最高的产品

按销售额从高到低排序,并输出所有产品信息

data={
    "产品名称":["A","B","C","D"],
    "单价":[100,150,200,120],
    "销量":[50,30,20,40]
}
df=pd.DataFrame(data)
df

产品名称 单价 销量
0 A 100 50
1 B 150 30
2 C 200 20
3 D 120 40
#计算每种产品的总销售额
df["总销售额"]=df["单价"]*df["销量"]
df

产品名称 单价 销量 总销售额
0 A 100 50 5000
1 B 150 30 4500
2 C 200 20 4000
3 D 120 40 4800
# 找出销售额最高的产品
df.nlargest(1,"总销售额")

产品名称 单价 销量 总销售额
0 A 100 50 5000
#按销售额从高到低排序,并输出所有产品信息
df.sort_values(by="总销售额",ascending=0)

产品名称 单价 销量 总销售额
0 A 100 50 5000
3 D 120 40 4800
1 B 150 30 4500
2 C 200 20 4000
2.5.3 电商用户行为数据分析

已知某电商平台的用书行为数据

计算每位用户的总消费金额

找出消费金额最高的用户并输出其所有信息

计算所有用户的平均消费金额(保留两位小数)

统计电子产品的总购买数量

data={
    "用户id":[101,102,103,104,105],
    "用户名":["A","B","C","D","E"],
    "商品类别":["电子产品","服饰","电子产品","家具","服饰"],
    "商品单价":[1200,367,828,151,221],
    "购买数量":[1,3,2,5,4]
}
df=pd.DataFrame(data)
df

用户id 用户名 商品类别 商品单价 购买数量
0 101 A 电子产品 1200 1
1 102 B 服饰 367 3
2 103 C 电子产品 828 2
3 104 D 家具 151 5
4 105 E 服饰 221 4
# 计算每位用户的总消费金额
df["总消费金额"]=df["商品单价"]*df["购买数量"]
df

用户id 用户名 商品类别 商品单价 购买数量 总消费金额
0 101 A 电子产品 1200 1 1200
1 102 B 服饰 367 3 1101
2 103 C 电子产品 828 2 1656
3 104 D 家具 151 5 755
4 105 E 服饰 221 4 884
# 找出消费金额最高的用户并输出其所有信息
df.nlargest(1,"总消费金额")

用户id 用户名 商品类别 商品单价 购买数量 总消费金额
2 103 C 电子产品 828 2 1656
# 计算所有用户的平均消费金额(保留两位小数)
print(df["总消费金额"].mean().round(2))

1119.2

#统计电子产品的总购买数量
print(df[df["商品类别"]=="电子产品"]["购买数量"].sum())

3

posted @ 2026-03-03 23:11  wangzy336  阅读(36)  评论(0)    收藏  举报