03 -1 pandas 中 DataFrame理解与创建、索引、运算的详解以及实例

本文详细介绍了pandas DataFrame的数据结构,包括如何创建DataFrame、行和列的索引以及各种运算操作。DataFrame是表格型数据结构,可以看作由Series组成的字典,具备行索引和列索引。文章还涵盖了DataFrame的创建方法、索引技巧(列索引、行索引、元素索引)以及与数值、其他DataFrame和Series的运算。同时,文章提供了多个实践练习,帮助读者巩固所学知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataFrame

DataFrame是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(共用同一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

  • 行索引:index 代表样本
  • 列索引:columns 代表维度
  • 值:values(numpy的二维数组)
1)DataFrame的创建

最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。

此外,DataFrame会自动加上每一行的索引(和Series一样)。

同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。

DataFrame的创建
import numpy as np
import pandas as pd
from pandas import Series,DataFrame

通过 DateFrame 函数 创建

df = DataFrame([1,2,3,4])
结果为:
	0
0	1
1	2
2	3
3	4
df = DataFrame([1,2,3,4],index=list("abcd"))
结果为:

	0
a	1
b	2
c	3
d	4
data = np.random.randint(0,150,size=(4,4))
index = ["张三","李四","王五","赵柳"]
columns = ["Math","Chinese","English","Python"]
df = DataFrame(data,index=index,columns=columns)
df
结果为:如下表
MathChineseEnglishPython
张三101451511
李四1259771130
王五1497914967
赵柳1332613570

DataFrame属性:values、columns、index、shape

df.values #所有的值
结果为:
array([[ 10, 145,  15,  11],
       [125,  97,  71, 130],
       [149,  79, 149,  67],
       [133,  26, 135,  70]])
df.columns # 每一列的标题
结果为:
Index(['Math', 'Chinese', 'English', 'Python'], dtype='object')
df.index #每一行的标题
结果为:
Index(['张三', '李四', '王五', '赵柳'], dtype='object')
df.shape
结果为:
(4, 4)

============================================

练习4:

根据以下考试成绩表,创建一个DataFrame,命名为df:

    张三  李四
语文 150  0
数学 150  0
英语 150  0
理综 300  0

============================================

data = [[150,0],[150,0],[150,0],[150,0]]
index = ["语文","数学","英语","理综"]
columns = ["张三","李四"]
DataFrame(data=data,index=index,columns=columns)
张三李四
语文1500
数学1500
英语1500
理综1500
2)DataFrame的索引

(1) 对列进行索引

- 通过类似字典的方式
- 通过属性的方式

可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。

每一行是一个样本 每一列是描述这个样本的维度

df
MathChineseEnglishPython
张三101451511
李四1259771130
王五1497914967
赵柳1332613570
df["Math"] # 按照字典的方式去从DataFrame里取数据
结果为
张三     10
李四    125
王五    149
赵柳    133
Name: Math, dtype: int32
type(df["Math"])
结果为:pandas.core.series.Series
df.Math
结果为:
张三     10
李四    125
王五    149
赵柳    133
Name: Math, dtype: int32

(2) 对行进行索引

- 使用.loc[]加index来进行行索引
- 使用.iloc[]加整数来进行行索引

同样返回一个Series,index为原来的columns。

df["张三"] # columns才能以索引的方式去取 index不行
结果为:
KeyError: '张三'
df.loc["张三"]
结果为:
Math        10
Chinese    145
English     15
Python      11
Name: 张三, dtype: int32
df.iloc[0]
结果为:
Math        10
Chinese    145
English     15
Python      11
Name: 张三, dtype: int32

总结

columns 才能以索引的形式去找 df[“列名”] df.列名

index 不能用索引的方式去找 只能用 loc[] 和 iloc[] 去定位内容

(3) 对元素进行索引

- 使用列索引
- 使用行索引(iloc[3,1]相当于两个参数;iloc[[3,3]] 里面的[3,3]看做一个参数)
- 使用values属性(二维numpy数组)

df["Math"].loc["张三"]   结果为:10
df["Math"].iloc[0]		结果为:10
df.loc["张三"]
结果为:
Math        10
Chinese    145
English     15
Python      11
Name: 张三, dtype: int32
type(df.loc["张三"])
结果为:
pandas.core.series.Series
df.loc["张三"].loc["Math"]
结果为:10

DataFrame自带的方式

loc是DataFrame提供的定位元素的方法 ,可以传入行的名称去查找整行,也可以 先传入行名称 ,再传入列名称 去定位元素,但是不能直接把列的名称放前面

df.loc["张三","Math"]   结果为:10
df.loc["Math","张三"]  此查找方法错误
# 终极方式
df.values[0,0]        结果为:10

【注意】 直接用中括号时:

  • 索引表示的是列索引
  • 切片表示的是行切片
df
MathChineseEnglishPython
张三581199495
李四31742124
王五59241052
赵柳242883In [64]:
df["Math"] #df后面跟中括号作为索引的话 只能传入列名 对列进行索引 
结果为:
张三     10
李四    125
王五    149
赵柳    133
Name: Math, dtype: int32
df[0:3] #df后面的中括号中 如果传的是切片的方式 是对行进行切片
结果为:如下表
MathChineseEnglishPython
张三101451511
李四1259771130
王五1497914967
df["Math":"English"] # 如果想对列进行切片
结果如下表:
MathChineseEnglishPython
df.iloc[:,0:2] # 需要通过iloc才能对列进行切片
MathChinese
张三10145
李四12597
王五14979
赵柳13326

============================================

练习5:

使用多种方法对df进行索引和切片,并比较其中的区别

============================================

3)DataFrame的运算

(1) DataFrame和数值的运算

df+1 # 所有内容都加一
MathChineseEnglishPython
张三111461612
李四1269872131
王五1508015068
赵柳1342713671
df["Python"] = df["Python"]+1 #两种方法是一样的效果,所以相当于加了两次
df["Python"]+=1
df
MathChineseEnglishPython
张三101451514
李四1259771133
王五1497914970
赵柳1332613573
df["Python"]["张三"] +=1
df
MathChineseEnglishPython
张三101451515
李四1259771133
王五1497914970
赵柳1332613573

(2) DataFrame与DataFrame之间的运算

同Series一样:

  • 在运算中自动对齐不同索引的数据
  • 如果索引不对应,则补NaN

下面是Python 操作符与pandas操作函数的对应表:

Python OperatorPandas Method(s)
+add()
-sub(), subtract()
*mul(), multiply()
/truediv(), div(), divide()
//floordiv()
%mod()
**pow()
df1 = DataFrame(np.random.randint(0,150,size=(5,5)),
                index=list("01234"),
                columns=list("ABCDE"))
df2 = DataFrame(np.random.randint(0,150,size=(5,5)),
                index=list("12345"),
                columns=list("ABCDE"))
display(df1,df2)
ABCDE
01051437014825
121130785138
221514639115
320139589011
435566410119
ABCDE
174143127385
2761233017103
3891278443134
4464197133109
597910250112
df1+df2 # 行和列索引名都对应 则 对应项相加
ABCDE
0NaNNaNNaNNaNNaN
195.0273.090.0124.0123.0
278.0138.0176.056.0218.0
3109.0266.0142.0133.0145.0
481.097.0161.0234.0128.0
5NaNNaNNaNNaNNaN

(3) DataFrame和Series之间的运算

df1 = DataFrame(data=np.random.randint(0,150,size=(5,5)),index=list("ABCDE"),columns=list("01234"))
s1 = Series(data=np.random.randint(0,150,size=5),index=list("01234"))
s2 = Series(data=np.random.randint(0,150,size=5),index=list("ABCDE"))
df1
01234
A14331159181
B86478579
C1421162398114
D301133986113
E704839122
s1
结果为:
0     44
1    101
2     67
3     63
4    124
dtype: int32
df1+s1 #series的索引和DataFrame的列索引对应 则每一行对应项相加
01234
A114175230192126
B183110212106198
C8614216288167
D2269222052117
E1985622356232
s2
结果为:
A      7
B     64
C     56
D    141
E     88
dtype: int32
df1
01234
A14331159181
B86478579
C1421162398114
D301133986113
E704839122
df1+s2 #默认是 Series的索引和DataFrame的列索引去对应 然后相加
01234ABCDE
ANaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
BNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
CNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
DNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
ENaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
df1.add(s2,axis="index")
01234
A15038229888
B7212814212173
C19817279154170
D171254180227254
E9588136127210

============================================

练习6:

  1. 假设df1是期中考试成绩,df2是期末考试成绩,请自由创建df1和df2,并将相加,求期中期末平均值。
  2. 假设张三期中考试数学被发现作弊,要记为0分,如何实现?
  3. 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
  4. 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?

============================================

In [103]:

index = ["张三","李四"]
columns = ["语文","数学","英语"]
data = np.random.randint(0,150,size=(2,3))
df1 = DataFrame(data,index=index,columns=columns)
df1
语文数学英语
张三1361196
李四395291
index = ["张三","李四"]
columns = ["语文","数学","英语"]
data = np.random.randint(0,150,size=(2,3))
df2 = DataFrame(data,index=index,columns=columns)
df2
语文数学英语
张三283057
李四27520
(df1+df2)/2
语文数学英语
张三82.020.576.5
李四33.028.555.5
df1["数学"].loc["张三"]    			结果为:11
df1.loc["张三"].loc["数学"]=0
df1
语文数学英语
张三136096
李四395291
df1.loc["李四"]+=100
df1
语文数学英语
张三136096
李四139152191
df1+=10
df1
语文数学英语
张三14610106
李四149162201
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值