4.2 掌握DataFrame的常用操作

4.2.1 查看DataFrame的常用属性

在这里插入图片描述

创建一个空的DataFrame
data = pd.DataFrame()

# 掌握DataFrame的常用操作
from pandas import DataFrame
# 创建一个空的DataFrame
data = pd.DataFrame()
# 构造数据框:DataFrame()
df = [[1.3, 2.0, 3, 4], [2, 4, 1, 4], [2, 5, 1.9, 7], [3, 1, 0, 11]]
print(df)
df = DataFrame(df, index=['a', 'b', 'c', 'd'], columns=list('ABCD'))
print(df)
df = DataFrame(index=['1', '2'], columns=['b', 'c'])   # 生成缺失值矩阵
print(df)
df = DataFrame(0, index=['1', '2'], columns=['b', 'c'])  # 生成全零矩阵
print(df)
df = {'color': ['blue', 'green', 'yellow', 'red', 'white'],
      'object': ['ball', 'pen', 'pencil', 'paper', 'mug'],
      'price': [1.2, 1.0, 0.6, 0.9, 1.7]}
print(df)
frame = DataFrame(df, index=['a', 'b', 'c', 'd', 'e'])
print(frame)

在这里插入图片描述

4.2.2 查改增删DataFrame数据

1、查看访问DataFrame中的数据

(1)DataFrame数据的基本查看方式

import pandas as pd
data = pd.read_csv('E:/Input/info.csv')
print(data.head(3))  # 打印前三行
# 1、使用字典访问内部数据的方式访问DataFrame单列数据
df = data['age']
# 2、使用访问属性的方式访问DataFrame单列数据(不建议使用,易引起混淆)
df = data.age
# 3、DataFrame单列多行数据获取
df = data['age'][:3]  # 获取age的前三行
# 4、DataFrame多列多行数据获取
df = data[['name', 'age']][:3]  # 获取name和age的前三行
print(df)
df = data[:][:3]  # 获取所有数据的前三行
print(df)
# 5、使用DataFrame的head和tail方法获取多行数据
print(data.head(4))  # 获取所有数据的前四行
print(data.tail(4))  # 获取所有数据的后四行

(2)DataFrame的loc、iloc访问方式

使用loc,iloc方法可以取出DataFrame中的任意数据。
使用loc方法和iloc实现多列切片,其原理是将多列的列名或者位置作为一个列表或者数据传入。
loc使用的时候内部传入的行索引名称如果为一个区间,则前后均为闭区间
loc内部还可以传入表达式,结果会返回满足表达式的所有值。
loc方法是针对DataFrame索引名称的切片方法,如果传入的不是索引名称,那么切片操作将无法执行。
利用loc方法,能够实现所有单层索引切片操作。loc方法使用方法如下。
DataFrame.loc[行索引名称或条件, 列索引名称]
iloc和loc区别是iloc接收的必须是行索引和列索引的位置。iloc方法的使用方法如下。
DataFrame.iloc[行索引位置, 列索引位置]
iloc方法使用时内部传入的行索引位置或列索引位置为区间时,则为前闭后开区间。
loc更加灵活多变,代码的可读性更高,iloc的代码简洁,但可读性不高。具体在数据分析工作中使用哪一种方法,根据情况而定,大多数时候建议使用loc方法

import pandas as pd
data = pd.read_csv('E:/Input/info.csv')
print(data.loc[:, ['name', 'age']])  # 使用loc提取name列和age列的所有数据
print(data.iloc[[1, 3], :])  # 使用iloc提取第1行和第3行的所有数据
# 使用loc、iloc实现条件切片
print(data.loc[data['age'] == 18, :])   # 输出age==18的行
print(data.iloc[(data['age'] == 18).values, :])

2、更改DataFrame中的数据

1) 更改DataFrame中的数据,原理是将这部分数据提取出来,重新赋值为新的数据。
需要注意的是,数据更改直接针对DataFrame原数据更改,操作无法撤销,如果做出更改,需要对更改条件做确认或对数据进行备份。
DataFrame.loc[行索引名称或条件, 列索引名称] = new_value

data['score'] = 95

2) 重命名rename,修改DataFrame中的表头名 : 将xuehao修改为stu_num

data.rename(columns={'xuehao': 'stu_num'}, inplace=True)
# inplace 代表操作是否对原数据生效。默认为False。

3、为DataFrame增添数据

添加一列:新建一个列索引,并对该索引下的数据进行赋值。
新增的一列值是相同的则直接赋值一个常量即可。

data['birth'] = 2023-data['age']

增加一行:使用 concat增加一行
直接传入标称属性为value的字典需要写入index,也就是说,需要在创建DataFrame对象时设定index。 index=[0]
当被添加对象是DataFrame时,concat方法不会自动调整index,此时若想要重设index,则在方法中加入参数ignore_index=True

new = pd.DataFrame({'id':11, 'name':'yanning', 'age':18, 'xuehao':202211, 'score':98}, index=[0])
data = pd.concat([data, new], ignore_index=True)  
# ignore_index=True:如果两个表index没有实际含义,使用该参数会重新整理一个index
print(data)

4、删除某列或某行数据

删除某列或某行数据需要用到pandas提供的方法drop,drop方法的用法如下。
DataFrame.drop(labels, axis=0, level=None, inplace=False, errors=‘raise’ )

data.drop(labels='birth', axis=1, inplace=True)

在这里插入图片描述

4.2.3 描述分析DataFrame数据

1.数值型特征的描述性统计——NumPy中的描述性统计函数

pandas库基于NumPy,自然也可以用这些函数对数据框进行描述性统计。
在这里插入图片描述
pandas还提供了更加便利的方法来计算均值 ,如detail[‘amounts’].mean()。
describe,能够一次性得出数据框所有数值型特征的非空值数目、均值、四分位数、标准差。
在这里插入图片描述

2、类别型特征的描述性统计

描述类别型特征的分布状况,可以使用频数统计表,pandas库中实现频数统计的方法为value_counts。
pandas提供了categories类,可以使用astype方法将目标特征的数据类型转换为category类别。
describe方法除了支持传统数值型以外,还能够支持对category类型的数据进行描述性统计,四个统计量分别为列非空元素的数目,类别的数目,数目最多的类别,数目最多类别的数目。

# 2、类别型特征的描述性统计
print(data['hobby'].value_counts())  # hobby频数统计结果
data['grade'] = data['grade'].astype('category')  # 转换为category类型
print(data['grade'].dtypes)  # 输出grade的类型
print(data['grade'].describe())  # 描述性统计

在这里插入图片描述

4.2.4 任务实现

1、查看数据的维度、形状、元素的个数

print(f"维度:{data.ndim}")
print(f"形状:{data.shape}")
print(f"个数:{data.size}")

2、统计

print(data['score'].describe())

3、剔除空值或者所有元素取值相同的列

def DropNull(data):
    beforelen = data.shape[1]
    print(f"before len = {beforelen}")
    print("剔除前数据的形状为:", data.shape)
    colisNull = data.describe().loc['count'] == 0
    for i in range(len(colisNull)):
        if colisNull[i]:
            data.drop(colisNull.index[i], axis=1, inplace=True)  # inplace代表操作是否对原数据生效。默认为False。
    stdisZero = data.describe().loc['std'] == 0
    for i in range(len(stdisZero)):
        if stdisZero[i]:
            data.drop(stdisZero.index[i], axis=1, inplace=True)
    afterlen = data.shape[1]
    print(f"after len = {afterlen}")
    print("剔除的数目为", beforelen - afterlen)
    print("剔除后数据的形状为:", data.shape)
    
print(data)
DropNull(data)  # 调用
print(data)

完整代码

import pandas as pd
import numpy as np
from pandas import DataFrame
# 4.2.1 掌握DataFrame的常用操作
# 构造数据框:DataFrame()
df = [[1.3, 2.0, 3, 4], [2, 4, 1, 4], [2, 5, 1.9, 7], [3, 1, 0, 11]]
print(df)
df = DataFrame(df, index=['a', 'b', 'c', 'd'], columns=list('ABCD'))
print(df)
df = DataFrame(index=['1', '2'], columns=['b', 'c'])   # 生成缺失值矩阵
print(df)
df = DataFrame(0, index=['1', '2'], columns=['b', 'c'])  # 生成全零矩阵
print(df)
df = {'color': ['blue', 'green', 'yellow', 'red', 'white'],
      'object': ['ball', 'pen', 'pencil', 'paper', 'mug'],
      'price': [1.2, 1.0, 0.6, 0.9, 1.7]}
print(df)
frame = DataFrame(df, index=['a', 'b', 'c', 'd', 'e'])
print(frame)

# 4.2.2查改增删
data = pd.read_csv('E:/Input/info.csv')
print(data.head(3))  # 打印前三行
# (一)DataFrame数据的基本查看方式
# 1、使用字典访问内部数据的方式访问DataFrame单列数据
df = data['age']
print(df)
# 2、使用访问属性的方式访问DataFrame单列数据(不建议使用,易引起混淆)
df = data.age
print(df)
# 3、DataFrame单列多行数据获取
df = data['age'][:3]  # 获取age的前三行
print(df)
# 4、DataFrame多列多行数据获取
df = data[['name', 'age']][:3]  # 获取name和age的前三行
print(df)
df = data[:][:3]  # 获取所有数据的前三行
print(df)
# 5、使用DataFrame的head和tail方法获取多行数据
print(data.head(4))  # 获取所有数据的前四行
print(data.tail(4))  # 获取所有数据的后四行
# (二)DataFrame的loc、iloc访问方式
# loc方法是针对DataFrame索引名称的切片方法,如果传入的不是索引名称,那么切片操作将无法执行。
# 利用loc方法,能够实现所有单层索引切片操作。loc方法使用方法如下。
#      DataFrame.loc[行索引名称或条件, 列索引名称]
# iloc和loc区别是iloc接收的必须是行索引和列索引的位置。iloc方法的使用方法如下。
#     DataFrame.iloc[行索引位置, 列索引位置]
data = pd.read_csv('E:/Input/info.csv')
print(data.loc[:, ['name', 'age']])  # 使用loc提取name列和age列的所有数据
print(data.iloc[[1, 3], :])  # 使用iloc提取第1行和第3行的所有数据
# 使用loc、iloc实现条件切片
print(data.loc[data['age'] == 18, :])  # 输出age==18的行
print(data.iloc[(data['age'] == 18).values, :])
# 2、更改DataFrame的数据
data['score'] = 95
print(data)
# 3、为DataFrame增添数据
data['birth'] = 2023 - data['age']
print(data)
# 4、删除某列或某行数据
data.drop(labels='birth', axis=1, inplace=True)
print(data)

# 4.2.3 描述分析DataFrame数据
# 1、数值型特征的描述性统计
print(np.mean(data['age']))  # 使用np.mean()计算平均年龄
print(data['age'].mean())  # 使用pandas实现求平均年龄
print(data[['age', 'score']].describe())  # 使用describe方法实现数值型特征的描述性统计
print(',,,,,,,,,,,,,,,,,,,,,,,')
# 2、类别型特征的描述性统计
print(data['hobby'].value_counts())  # hobby频数统计结果
data['grade'] = data['grade'].astype('category')  # 转换为category类型
print(data['grade'].dtypes)  # 输出grade的类型
print(data['grade'].describe())  # 描述性统计:四个统计量分别为列非空元素的数目,类别的数目,数目最多的类别,数目最多类别的数目。
print('---------------------')

# 4.2.4 任务实现
## 1、查看数据的维度、形状、元素的个数
print(f"维度:{data.ndim}")
print(f"形状:{data.shape}")
print(f"个数:{data.size}")
## 2、统计
print(data['score'].describe())
## 3、剔除空值或者所有元素取值相同的列
def DropNull(data):
    beforelen = data.shape[1]
    print(f"before len = {beforelen}")
    print("剔除前数据的形状为:", data.shape)
    colisNull = data.describe().loc['count'] == 0
    for i in range(len(colisNull)):
        if colisNull[i]:
            data.drop(colisNull.index[i], axis=1, inplace=True)  # inplace代表操作是否对原数据生效。默认为False。
    stdisZero = data.describe().loc['std'] == 0
    for i in range(len(stdisZero)):
        if stdisZero[i]:
            data.drop(stdisZero.index[i], axis=1, inplace=True)
    afterlen = data.shape[1]
    print(f"after len = {afterlen}")
    print("剔除的数目为", beforelen - afterlen)
    print("剔除后数据的形状为:", data.shape)

print(data)
DropNull(data)  # 调用
print(data)

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清木!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值