DataFrame数据框的Python操作

发布时间 2023-11-28 22:28:32作者: 郝hai

探索和清理数据听起来很无聊,而且不像训练最先进的 AI 模型那么酷。但如果你想成为一名专业的数据科学家,探索性数据分析和数据预处理也是必不可少的技能。幸运的是,有许多很棒的工具可以帮助您了解数据集。著名的 Python 数据处理模块 Pandas 就是其中之一。DataFrame是一个二维的表格数据结构,是pandas库中最重要的数据结构之一。它类似于电子表格或关系型数据库中的表格,可以存储和操作具有不同类型的数据。DataFrame由行索引(也称为标签)和列索引组成,可以看作是一系列Series对象的集合,其中每个Series代表一列数据。每列可以是不同的数据类型,如整数、浮点数、字符串或日期等。DataFrame提供了一系列功能强大的操作和方法,使得数据的清洗、转换、分析和可视化变得更加方便。您可以使用DataFrame来加载、处理和分析结构化的数据,进行数据探索和预处理,以及进行统计分析和建模等任务。

一、DataFrame 的常用操作

# 通过 DataFrame 构造数据框
d = [[1.0,2.2,3,4],[1,2,3,4],[7,8,9,0],[3,5,7,9]]
print(d)
df = pd.DataFrame(d)
print(df)
# index 修改行名称,columns 修改列名称
df = pd.DataFrame(d, index=['a', 'b', 'c', 'd'], columns=['A', 'B', 'C', 'D'])
print(df)
函数 values index columns dtypes size ndim shape
返回值 元素 索引 列名 类型 元素个数 维度数 数据形状/行列数目
# DataFrame 数据框的常用属性
d = [[1.0,2.2,3,4],[1,2,3,4],[7,8,9,0],[3,5,7,9]]
df = pd.DataFrame(d, index=['a', 'b', 'c', 'd'], columns=['A', 'B', 'C', 'D'])
print(df)
print(df.values)
print(df.index)
print(df.shape)
print(df.dtypes)

二、选取数据框的列或行

DataFrame.loc[行索引名称,列索引名称],如果传入的不是索引名称,那么切片操作将无法执行。
DataFrame.iloc[行索引位置,列索引位置],如果传入的不是索引位置,那么切片操作将无法执行。
loc方法的代码灵活多变,代码的可读性更高;iloc 方法的代码简洁,但可读性不高。

  • 使用 loc、iloc 方法实现多列切片,其原理是将多列的列名或者位置作为一个列表或者数据传入。
  • 使用 loc、iloc 方法可以取出 DataFrame 中的任意数据。
  • 在使用 loc 方法的时候内部传入的行索引名称如果为一个区间,则前后均为闭区间。其内部还可以传入表达式,结果会返回满足表达式的所有值。
  • 在使用 loc 方法的时候内部传入的行索引位置或列索引位置为区间时,则为前闭后开区间。
  • 使用 loc 方法能够实现所有单层索引切片操作。
# 按照行列顺序进行数据访问
print(df.iloc[0, 0])                 # 取出第一行第一列的数据
print(df.iloc[0:3, 0])               # 取出前三行第一列的数据
print(df.iloc[:, 0])                 # 取出第一列的数据
print(df.iloc[0, :])                 # 取出第一行的数据
print(df.iloc[1:3, 1:3])

三、删除数据框的元素

使用 drop 方法删除 Series 的元素或 DataFrame 的某一行(列)。

DataFrame.drop(labels=None, axis=0, levels=None, inplace=False)
参数名称 说明
labels 接收 string 或 array。代表删除的行或列的标签。无默认。
axis 接收0或1。代表操作的轴向。默认为0。
levels 接收 int 或者索引名。代表标签所在级别。默认为 None。
inplace 接收 boolean。代表操作是否对原数据生效。默认为 False。
d = [[1.0,2.2,3,4],[1,2,3,4],[7,8,9,0],[3,5,7,9]]
df = pd.DataFrame(d, index=['a', 'b', 'c', 'd'], columns=['A', 'B', 'C', 'D'])
print(df)
print(df.drop('D', axis=1, inplace=False))    # 删除数据框的列元素
print(df.drop(['a', 'c'], axis=0))            # 删除数据框的行元素

四、分析数据框数据

Pandas 库基于 Numpy 库,自然也可以用 Numpy 函数对数据框进行描述性统计,Pandas 提供了更加便利的方法来计算均值。

方法名称 说明 方法名称 说明
min 最小值 max 最大值
mean 均值 ptp 极差
median 中位数 std 标准差
var 方差 cov 协方差
sem 标准误差 mode 众数
skew 样本偏度 kurt 样本峰度
quantile 四分位数 count 非空值数目
describe 描述统计 mad 平均绝对离差

describe 方法能够一次性得出数据框所有数值型特征的非空值数目、均值、四分位数、标准差。

import pandas as pd
import numpy as np
d = [[1.0,2.2,3,4],[1,2,3,4],[7,8,9,0],[3,5,7,9]]
df = pd.DataFrame(d, index=['a', 'b', 'c', 'd'], columns=['A', 'B', 'C', 'D'])
print(df)
print(np.mean(df))              # 每一列的均值
print(np.mean(df, axis=1))      # 每一行的均值
print(df.mean(axis=1))          # 每一行的均值
print(df.std())                 # 标准差
df.describe()                   # 按列查看分布情况

五、绘制数据框Plot图

DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False, 
                sharex=None, sharey=False, layout=None, figsize=None, 
                use_index=True, title=None, grid=None, legend=True, 
                style=None, logx=False, logy=False, loglog=False, 
                xticks=None, yticks=None, xlim=None, ylim=None, rot=None, 
                fontsize=None, colormap=None, position=0.5, table=False, yerr=None, 
                xerr=None, stacked=True/False, sort_columns=False, 
                secondary_y=False, mark_right=True, **kwds)
#参数介绍
x和y:表示标签或者位置,用来指定显示的索引,默认为None
kind:表示绘图的类型,默认为line,折线图
line:折线图
bar/barh:柱状图(条形图),纵向/横向
pie:饼状图
hist:直方图(数值频率分布)
box:箱型图
kde:密度图,主要对柱状图添加Kernel 概率密度线
area:区域图(面积图)
scatter:散点图
hexbin:蜂巢图
ax:子图,可以理解成第二坐标轴,默认None
subplots:是否对列分别作子图,默认False
sharex:共享x轴刻度、标签。如果ax为None,则默认为True,如果传入ax,则默认为False
sharey:共享y轴刻度、标签
layout:子图的行列布局,(rows, columns)
figsize:图形尺寸大小,(width, height)
use_index:用索引做x轴,默认True
title:图形的标题
grid:图形是否有网格,默认None
legend:子图的图例
style:对每列折线图设置线的类型,list or dict
logx:设置x轴刻度是否取对数,默认False
logy
loglog:同时设置x,y轴刻度是否取对数,默认False
xticks:设置x轴刻度值,序列形式(比如列表)
yticks
xlim:设置坐标轴的范围。数值,列表或元组(区间范围)
ylim
rot:轴标签(轴刻度)的显示旋转度数,默认None
fontsize : int, default None#设置轴刻度的字体大小
colormap:设置图的区域颜色
colorbar:柱子颜色
position:柱形图的对齐方式,取值范围[0,1],默认0.5(中间对齐)
table:图下添加表,默认False。若为True,则使用DataFrame中的数据绘制表格
yerr:误差线
xerr
stacked:是否堆积,在折线图和柱状图中默认为False,在区域图中默认为True
sort_columns:对列名称进行排序,默认为False
secondary_y:设置第二个y轴(右辅助y轴),默认为False
mark_right : 当使用secondary_y轴时,在图例中自动用“(right)”标记列标签 ,默认True
x_compat:适配x轴刻度显示,默认为False。设置True可优化时间刻度的显示
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df3 = pd.DataFrame(
    {
        "a": np.random.randn(1000) + 1,
        "b": np.random.randn(1000),
        "c": np.random.randn(1000) - 1,
    },
    columns=["a", "b", "c"],
)

# alpha设置透明度
df3.plot.hist(alpha=0.5)

# 设置坐标轴显示负号
plt.rcParams['axes.unicode_minus'] = False
# 显示图形
plt.show()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

ix3 = pd.MultiIndex.from_arrays([['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'], ['foo', 'foo', 'bar', 'bar', 'foo', 'foo', 'bar', 'bar']], names=['letter', 'word'])
df3 = pd.DataFrame({'data1': [3, 2, 4, 3, 2, 4, 3, 2], 'data2': [6, 5, 7, 5, 4, 5, 6, 5]}, index=ix3)
# 分组
gp3 = df3.groupby(level=('letter', 'word'))
means = gp3.mean()
errors = gp3.std()
means.plot.bar(yerr=errors,rot=0)
plt.show()

参考文献

  1. 行远见大』Python 进阶篇:Pandas 库
  2. 解密 DataFrame|Pandas 数据操作的全面指南
  3. 一文教会你pandas plot各种绘图