Dataframe的数据结构特点如下:
1.Dataframe由共用相同索引的一组列组成
2.Dataframe是一个表格型数据结构,每列值类型可以不同
3.Dataframe常用于表达二维数组,也可用于表达多维数组
4.Dataframe既有行索引(index),也有列索引(columns),其中行索引的数组与行有关,它与 series的索引数组相似,每个标签与标签所在行的所有元素相关联。而列索引包含一系列列标签,每个标签与一列数据相关联
格式:pandas.Dataframe(data[,index[,columns]])
data:输入数据
index:行索引的标签
columns:列索引的标签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-prpuHlvC-1637637076616)(./输入给Dataframe的数据.png)]
(3)用字典生成Dataframe对象字典对象以每一列的名称作为键,每个键都有一个数组或列表或元组作为值
例如,创建一个包含学生姓名、性别和年龄的Dataframe对象。首先创建一个字典对象,然后将字典对象传入给Dataframe()构造函数,代码如下:
import pandas as pd
dt={'name':['潘传志','张坊','小明'],"sex":['男','男','男'],"age":[18,19,21]}
df=pd.Dataframe(dt)
df
| name | sex | age | |
|---|---|---|---|
| 0 | 潘传志 | 男 | 18 |
| 1 | 张坊 | 男 | 19 |
| 2 | 小明 | 男 | 21 |
如果只需要用字典对象中部分列来创建Dataframe对象,可通过columns参数指定字典的列名,示例如下:
df=pd.Dataframe(dt,columns=['name','age'])
df
| name | age | |
|---|---|---|
| 0 | 潘传志 | 18 |
| 1 | 张坊 | 19 |
| 2 | 小明 | 21 |
如果想用自定义标签作为Dataframe索引,则要将标签放到数组中,赋值给index选项,代码如下
df=pd.Dataframe(dt,index=['帅哥','美女','小屁孩'],columns=['name','age'])
df
| name | age | |
|---|---|---|
| 帅哥 | 潘传志 | 18 |
| 美女 | 张坊 | 19 |
| 小屁孩 | 小明 | 21 |
嵌套字典是python广泛使用的数据结构,例如嵌套字典表示学生姓名和年龄
dt = {'name':{'a':'张艳','b':'李明','c':'王勇'},'age':
{'a':18,'c':21}}
解释嵌套时,pandas会用NaN填补缺失的元素
df=pd.Dataframe(dt) df
| name | age | |
|---|---|---|
| a | 张艳 | 18.0 |
| b | 李明 | NaN |
| c | 王勇 | 21.0 |
利用numpy.arange(8).reshape(2,4)创建2行4列的二维数组,然后将其传递给Dataframe()构造函数,可创建一个Dataframe对象,其代码如下:
import numpy as np df = pd.Dataframe(np.arange(8).reshape(2,4)) df
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0 | 0 | 1 | 2 | 3 |
| 1 | 4 | 5 | 6 | 7 |
例如:创建一个产品价格表的Dataframe对象
dt = {'product':pd.Series(['电视机','空调','洗衣机','电脑']),'price':pd.Series([2300,1900,500])}
df=pd.Dataframe(dt)
df
| product | price | |
|---|---|---|
| 0 | 电视机 | 2300.0 |
| 1 | 空调 | 1900.0 |
| 2 | 洗衣机 | 500.0 |
| 3 | 电脑 | NaN |
Dataframe属性有index和columns,调用columns可获取Dataframe对象所有列的名称,获取索引列表调用index属性即可,代码如下:
df.columns
Index(['product', 'price'], dtype='object')
df.index
RangeIndex(start=0, stop=4, step=1)(2) 选择所有的元素
如果想获取储存在数据结构中的元素,可使用values属性获取所有的元素。其代码如下:
df.values
array([['电视机', 2300.0],
['空调', 1900.0],
['洗衣机', 500.0],
['电脑', nan]], dtype=object)
(3) 选择一列元素
如果选择一列的内容,可把这一列的名称作为索引或者用Dataframe实例的属性,其示例代码如下:
df['price']
0 2300.0 1 1900.0 2 500.0 3 NaN Name: price, dtype: float64
df.price
0 2300.0 1 1900.0 2 500.0 3 NaN Name: price, dtype: float64
df.price和df.[‘price’]的输出结果相同,返回值为Series对象的price列的内容
(4) 选择一行元素如果想选择一行的内容,利用iloc属性和行的索引值就能获取到。例如,获取产品价格表第3行数据,其示例代码如下
df.iloc[2]
product 洗衣机 price 500.0 Name: 2, dtype: object(5)选择多行元素
利用iloc属性和一个数组的切片来指定Dataframe实例的索引列表的取值范围,从而可选取多行元素。例如,选择产品价格表的Dataframe实例中第1行和第3行元素,其代码如下:
df.iloc[0:4:2]
| product | price | |
|---|---|---|
| 0 | 电视机 | 2300.0 |
| 2 | 洗衣机 | 500.0 |
0表示起始值,4表示终止值(不含4),步长2,所取行数是0和2
(6)选择Dataframe实例中的一个元素或一个范围内的元素如果想获取存储在Dataframe实例中的一个元素,需要依次指定元素所在的列名称、行的索引值或标签。例如,用df[‘product’][1]可选择产品为“空调”的元素
如果想获取某个范围内的元素,可用切片方式指定元素所在的列名称的范围和行的索引值或标签的范围。例如,用df[‘product’][1:3]可选择产品名称为“空调”和“洗衣机”的元素
3.给Dataframe赋值 (1)指定行索引和列索引标签前面讲过index属性指定索引数组,columns属性指定包含列名称的行,而使用name属性,通过对实例进行df设置(df.index.name和df.columns.name)就可以指定行索引标签和列索引标签。比如,对产品价格表指定行索引标签和列索引标签,其代码如下:
df.index.name='序号'
df.columns.name='类型'
df
| 类型 | product | price |
|---|---|---|
| 序号 | ||
| 0 | 电视机 | 2300.0 |
| 1 | 空调 | 1900.0 |
| 2 | 洗衣机 | 500.0 |
| 3 | 电脑 | NaN |
为Dataframe实例添加一行元素的方法就是指定Dataframe实例新列的名称,并为其赋值即可。例如,为产品价格增加一个折扣率,其代码如下:
df['discount']=[0.9,0.85,0.5,1]
df
| 类型 | product | price | discount |
|---|---|---|---|
| 序号 | |||
| 0 | 电视机 | 2300.0 | 0.90 |
| 1 | 空调 | 1900.0 | 0.85 |
| 2 | 洗衣机 | 500.0 | 0.50 |
| 3 | 电脑 | NaN | 1.00 |
或者用insert()函数在指定位置添加一列元素。例如,在折扣率后面,添加一列最终价格“Actual_price”列,其代码如下:
df.insert(3,'Actual_price',df['price']*df['discount'])
df
| 类型 | product | price | discount | Actual_price |
|---|---|---|---|---|
| 序号 | ||||
| 0 | 电视机 | 2300.0 | 0.90 | 2070.0 |
| 1 | 空调 | 1900.0 | 0.85 | 1615.0 |
| 2 | 洗衣机 | 500.0 | 0.50 | 250.0 |
| 3 | 电脑 | NaN | 1.00 | NaN |
为Dataframe实例添加一行元素的方法是使用loc属性为Dataframe实例新添加一行,并为此赋值即可。例如,为产品价格增加一个手机产品的价格行,其实例代码如下:
df.loc['4']=['手机',1900,1,1900]
df
| 类型 | product | price | discount | Actual_price |
|---|---|---|---|---|
| 序号 | ||||
| 0 | 电视机 | 2300.0 | 0.90 | 2070.0 |
| 1 | 空调 | 1900.0 | 0.85 | 1615.0 |
| 2 | 洗衣机 | 500.0 | 0.50 | 250.0 |
| 3 | 电脑 | NaN | 1.00 | NaN |
| 4 | 手机 | 1900.0 | 1.00 | 1900.0 |
使用loc属性指定Dataframe实例中行索引,并为此行赋值即可。例如,修该产品价格中电脑一行的数据,其实例代码如下:
df.loc[3]=['电脑',4500,0.9,4500*0.9]
df
| 类型 | product | price | discount | Actual_price |
|---|---|---|---|---|
| 序号 | ||||
| 0 | 电视机 | 2300.0 | 0.90 | 2070.0 |
| 1 | 空调 | 1900.0 | 0.85 | 1615.0 |
| 2 | 洗衣机 | 500.0 | 0.50 | 250.0 |
| 3 | 电脑 | 4500.0 | 0.90 | 4050.0 |
| 4 | 手机 | 1900.0 | 1.00 | 1900.0 |
修改实例中的一列元素只需要将更新的一列元素存放到数组中,然后将此数组赋值给这一列即可。例如,修改产品价格中的加个微信新价格[3000,2300,560,5600,1800],其实例代码如下:
df['price']=[3000,2300,560,5600,1800] df
| 类型 | product | price | discount | Actual_price |
|---|---|---|---|---|
| 序号 | ||||
| 0 | 电视机 | 3000 | 0.90 | 2070.0 |
| 1 | 空调 | 2300 | 0.85 | 1615.0 |
| 2 | 洗衣机 | 560 | 0.50 | 250.0 |
| 3 | 电脑 | 5600 | 0.90 | 4050.0 |
| 4 | 手机 | 1800 | 1.00 | 1900.0 |
注意:修改价格后,也只修改了价格行数据,其他行没有发生变化
修改一个元素,只需将该元素直接给其赋值即可。例如df[‘discount’][1]=0.96
4.删除元素 (1) 使用del删除一列元素使用一整列元素的所有数据用del命令,例如,删除产品价格中的实际价格列,其示例代码如下:
del df['Actual_price'] df
| 类型 | product | price | discount |
|---|---|---|---|
| 序号 | |||
| 0 | 电视机 | 3000 | 0.90 |
| 1 | 空调 | 2300 | 0.85 |
| 2 | 洗衣机 | 560 | 0.50 |
| 3 | 电脑 | 5600 | 0.90 |
| 4 | 手机 | 1800 | 1.00 |
pop()函数可以将所选列从原数据块中删除,原数据块不再保留该列。例如,使用pop()函数删除折扣率,其示例代码如下:
df.pop('discount')
序号 0 0.90 1 0.85 2 0.50 3 0.90 4 1.00 Name: discount, dtype: float64
df
| 类型 | product | price |
|---|---|---|
| 序号 | ||
| 0 | 电视机 | 3000 |
| 1 | 空调 | 2300 |
| 2 | 洗衣机 | 560 |
| 3 | 电脑 | 5600 |
| 4 | 手机 | 1800 |
drop函数有两个参数,一个参数是axis,当axis=1时,删除列元素;当axis=时,删除行元素。
还有一个参数是inplace,当inplace为True时,drop()函数执行内部删除,不返回任何值,原数据发生改变;当inplace为False时,原数据不会发生改变,只是输出新变量删除。例如,先添加1列折扣率,然后用drop()函数设置axis=1和inplace=True删除折扣率的元素,其示例代码如下:
df['discount']=[0.9,0.8,0.99,0.85,0.75]
df
| 类型 | product | price | discount |
|---|---|---|---|
| 序号 | |||
| 0 | 电视机 | 3000 | 0.90 |
| 1 | 空调 | 2300 | 0.80 |
| 2 | 洗衣机 | 560 | 0.99 |
| 3 | 电脑 | 5600 | 0.85 |
| 4 | 手机 | 1800 | 0.75 |
df.drop(['discount'],axis=1,inplace=False)
| 类型 | product | price |
|---|---|---|
| 序号 | ||
| 0 | 电视机 | 3000 |
| 1 | 空调 | 2300 |
| 2 | 洗衣机 | 560 |
| 3 | 电脑 | 5600 |
| 4 | 手机 | 1800 |
如果要删除一行,则设置axis=0,并指定删除的行索引和行标签。例如,删除行标签为
df.drop(['4'],axis=0,inplace=True)
df
| 类型 | product | price | discount |
|---|---|---|---|
| 序号 | |||
| 0 | 电视机 | 3000 | 0.90 |
| 1 | 空调 | 2300 | 0.80 |
| 2 | 洗衣机 | 560 | 0.99 |
| 3 | 电脑 | 5600 | 0.85 |
如果要删除多行,除了设置axis=0外,还要指定删除的行索引或行标签,例如,删除第1行和第3行的元素:
df.drop([0,2],axis=0,inplace=True)
df
| 类型 | product | price | discount |
|---|---|---|---|
| 序号 | |||
| 1 | 空调 | 2300 | 0.80 |
| 3 | 电脑 | 5600 | 0.85 |
df.loc['4']=['U盘','2800','0.95']
df
| 类型 | product | price | discount |
|---|---|---|---|
| 序号 | |||
| 1 | 空调 | 2300 | 0.8 |
| 3 | 电脑 | 5600 | 0.85 |
| 4 | U盘 | 2800 | 0.95 |
对于Dataframe对象,也可以通过指定条件来筛选元素。例如,筛选产品价格大于2000的产品信息(首先要对price进行强制类型转换)
df['price'] = pd.to_numeric(df['price']).astype(int) df[df['price']>3000]
| 类型 | product | price | discount |
|---|---|---|---|
| 序号 | |||
| 3 | 电脑 | 5600 | 0.85 |
df
| 类型 | product | price | discount |
|---|---|---|---|
| 序号 | |||
| 1 | 空调 | 2300 | 0.8 |
| 3 | 电脑 | 5600 | 0.85 |
| 4 | U盘 | 2800 | 0.95 |
使用isin()函数,在则返回True,不在则返回False
例如,判断产品价格中是否存在“电脑”和2300元素,并返回满足条件的元素
df[df.isin(['空调','2300'])]
| 类型 | product | price | discount |
|---|---|---|---|
| 序号 | |||
| 1 | 空调 | NaN | NaN |
| 3 | NaN | NaN | NaN |
| 4 | NaN | NaN | NaN |
转置即行变成列,列变成行,pandas提供了一种简单的转置方法,就是通过调用T属性转置,例如将产品价格数据结构进行转置,其示例代码如下:
df.T
| 序号 | 1 | 3 | 4 |
|---|---|---|---|
| 类型 | |||
| product | 空调 | 电脑 | U盘 |
| price | 2300 | 5600 | 2800 |
| discount | 0.8 | 0.85 | 0.95 |



