前言
系列文章目录
[Python]目录
视频及资料和课件
链接:https://pan.baidu.com/s/1LCv_qyWslwB-MYw56fjbDg?pwd=1234
提取码:1234
文章目录
- 前言
- 1. DataFrame 对象创建
- 2. DataFrame 的属性
- 3. DataFrame 的方法
- 3.1 head() ---- 返回 DataFrame 对象的前 x 行
- 3.2 tail() ---- 返回 DataFrame 对象的后 x 行
- 3.3 mean() ---- 求算术平均数
- 3.4 min() max() ---- 求最值
- 3.5 idxmax() idxmin() ---- 获取最值索引
- 3.6 median() ---- 求中位数
- 3.7 value_counts() ---- 求频数
- 3.8 mode() ---- 求众数
- 3.9 quantile() ---- 求四分位数
- 3.10 std() ---- 标准差
- 3.11 describe() ---- 统计 DataFrame 的常见统计学指标结果
- 3.12 corr() ---- 求每列之间的相关系数矩阵
- 3.12 cov() ---- 求每列之间的协方差矩阵
- 3.13 sort_values() ---- 根据元素值进行排序
- 3.14 sort_index() ---- 根据索引值进行排序
- 3.15 apply() ---- 根据传入的函数参数处理 DataFrame 对象
- 3.16 applymap() ---- 根据传入的函数参数处理 DataFrame 对象的每个元素
- 3.17 groupby() ---- 对 DataFrame 对象中的数据进行分组
- 3.18 pivot_table() ---- 生成DataFrame对象的透视表
- 3.19 drop_duplicates ---- 处理重复值
- 3.20 isnull() ---- 判断是否为缺失值
- 3.21 notnull() ---- 判断是否不为缺失值
- 3.22 sum() ---- 求和
- 3.23 dropna() ---- 删除缺失值
- 3.24 fillna() ---- 替换缺失值
- 3.25 info() ---- 获取 DataFrame 中数据的简要摘要
- 3.26 count() ---- 统计每列中不为空的值的个数
- 3.27 copy() ---- 对DateFrame对象进行复制
- 4. DataFrame 的常用操作
包的引入:
import numpy as np import pandas as pd
- 1
- 2
1. DataFrame 对象创建
1.1 通过列表创建 DataFrame 对象
l = [1, 2, 3, 4, 5]
df = pd.DataFrame(l)
print(df)
print()
print(type(df))
- 1
- 2
- 3
- 4
- 5
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(l)
print(df1)
print()
print(type(df1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
l = [
{'zs', 12, 'm'},
{'ls', 23, 'm'},
{'ww', 22, 'm'}
]
df1 = pd.DataFrame(l)
print(df1)
print()
print(type(df1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
由于集合是无序的,所以创建的 DataFrame 对象中元素的顺序也无序。
1.2 通过元组创建 DataFrame 对象
t = (1, 2, 3, 4, 5)
df = pd.DataFrame(t)
print(df)
print()
print(type(df))
- 1
- 2
- 3
- 4
- 5
l = (
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
)
df1 = pd.DataFrame(l)
print(df1)
print()
print(type(df1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
l = (
{'zs', 12, 'm'},
{'ls', 23, 'm'},
{'ww', 22, 'm'}
)
df1 = pd.DataFrame(l)
print(df1)
print()
print(type(df1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
1.3 通过集合创建 DataFrame 对象
集合内不能嵌套集合、列表
s = {1, 2, 3, 4, 5, 2, 2, 5, 6}
df = pd.DataFrame(s)
print(df)
print()
print(type(df))
- 1
- 2
- 3
- 4
- 5
l = {
('zs', 12, 'm'),
('ls', 23, 'm'),
('ww', 22, 'm')
}
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c'],
dtype='float64'
)
print(df1)
print()
print(type(df1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
1.4 通过字典创建 DataFrame 对象
d = {
'zs': 12,
'ls': 23,
'ww': 22
}
# 只有一层字典必须使用 index 指定索引
# index 指定的索引为行索引
# 字典的 key 为列索引
df = pd.DataFrame(d, index=['age'])
print(df)
print()
print(type(df))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
d = {
'zs': {'age': 12, 'gender': 'm'},
'ls': {'age': 23, 'gender': 'm'},
'ww': {'age': 22, 'gender': 'm'}
}
# 多层字典不用使用 index 指定索引
# 外层字典的 key 为列索引
# 内层字典的 key 为行索引
df = pd.DataFrame(d)
print(df)
print()
print(type(df))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
d = {
'zs': [12, 'm'],
'ls': [23, 'm'],
'ww': [22, 'm']
}
df1 = pd.DataFrame(d)
print(df1)
print()
print(type(df1))
print()
df2 = pd.DataFrame(d, index=['age', 'gender'])
print(df2)
print()
print(type(df2))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
1.5 通过Series 对象创建 DataFrame 对象
l = pd.Series([1,2,3])
df = pd.DataFrame(l)
print(df)
print()
print(type(df))
- 1
- 2
- 3
- 4
- 5
l = [
pd.Series([1,2,3]),
pd.Series([4,5,6]),
pd.Series([7,8,9])
]
df = pd.DataFrame(l)
print(df)
print()
print(type(df))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
1.6 通过 ndarray 创建 DataFrame 对象
l = np.array([1,2,3])
df = pd.DataFrame(l)
print(df)
print()
print(type(df))
- 1
- 2
- 3
- 4
- 5
l = [
np.array([1,2,3]),
np.array([4,5,6]),
np.array([7,8,9])
]
df = pd.DataFrame(l)
print(df)
print()
print(type(df))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
1.7 创建 DataFrame 对象时指定列索引
- columns:指定列索引
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(l, columns=['name', 'age', 'gender'])
print(df1)
print()
print(type(df1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
1.8 创建 DataFrame 对象时指定行索引
- index:指定行索引
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(type(df1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
1.9 创建 DataFrame 对象时指定元素的数据类型
- dtype:指定元素的数据类型
字符串数据类型的数据元素会被忽略
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c'],
dtype='float64'
)
print(df1)
print()
print(type(df1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
1.10 创建 DataFrame 对象的注意点
使用列表创建 DataFrame 对象时,不同列表的长度不同会报错。
data = {
'one': [1,2,3],
'two': [1,2,3,4],
}
df = pd.DataFrame(data)
- 1
- 2
- 3
- 4
- 5
ValueError: All arrays must be of the same length
- 1
使用 Series 对象创建 DataFrame 对象,不同长度不同会报错。
data = {
'one': pd.Series([1,2,3]),
'two': pd.Series([1,2,3,4]),
}
df = pd.DataFrame(data)
print(df)
- 1
- 2
- 3
- 4
- 5
- 6
Series 可以保证列数据个数不一样的不同列的各行数据元素位置相对应
data = {
'one': pd.Series([1, 2, 3], index=['a', 'b', 'd']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
}
df = pd.DataFrame(data)
print(df)
- 1
- 2
- 3
- 4
- 5
- 6
data = {
'one': pd.Series([1, 2, 3], index=['a', 'b', 'd']),
'two': pd.Series([1, 2, 3, 4], index=['e', 'f', 'g', 'h']),
}
df = pd.DataFrame(data)
print(df)
- 1
- 2
- 3
- 4
- 5
- 6
2. DataFrame 的属性
2.1 axes ---- 返回行/列标签列表
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.axes)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.2 columns ---- 返回列标签列表
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.columns)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.3 index ---- 返回行标签列表
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.index)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.4 dtypes ---- 返回数据类型
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.dtypes)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.5 empty ---- 返回 DataFrame 对象是否为空
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.empty)
print()
df2 = pd.DataFrame()
print(df2)
print()
print(df2.empty)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
2.6 ndim ---- 返回 DateFrame 对象的维数
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.ndim)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.7 size ---- 返回DateFrame 对象中的数据元素个数
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.size)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.8 values ---- 返回数据元素组成的 ndarray 数组
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.values)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.9 shape ---- 返回 DataFrame 对象的维度
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.shape)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.10 T ---- 返回 DataFrame 对象的转置
l = [
pd.Series([1,2,3]),
pd.Series([4,5,6]),
pd.Series([7,8,9])
]
df = pd.DataFrame(l)
print(df)
print()
print(df.T)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3. DataFrame 的方法
3.1 head() ---- 返回 DataFrame 对象的前 x 行
默认前五行
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.head(1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3.2 tail() ---- 返回 DataFrame 对象的后 x 行
默认后五行
l = [
['zs', 12, 'm'],
['ls', 23, 'm'],
['ww', 22, 'm']
]
df1 = pd.DataFrame(
l,
columns=['name', 'age', 'gender'],
index=['a', 'b', 'c']
)
print(df1)
print()
print(df1.tail(1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3.3 mean() ---- 求算术平均数
# 生成一个 6 行 3 列的数组
data = np.floor(np.random.normal(85, 3, (6,3)))
df = pd.DataFrame(data)
print(df)
print()
# 默认计算每列的算数平均数
print(df.mean())
print()
# axis 可以指定计算的方向,默认 axis=0 计算每列的算数平均数
print(df.mean(axis=0))
print()
# 计算每行的算数平均数
print(df.mean(axis=1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
3.4 min() max() ---- 求最值
# 生成一个 6 行 3 列的数组
data = np.floor(np.random.normal(85, 3, (6,3)))
df = pd.DataFrame(data)
print(df)
print()
# 默认计算每列的最值
print(df.max())
print(df.min())
print()
# axis 可以指定计算的方向,默认 axis=0 计算每列的最值
print(df.max(axis=0))
print(df.min(axis=0))
print()
# 计算每行的算数平均数
print(df.max(axis=1))
print(df.min(axis=1))
print()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
3.5 idxmax() idxmin() ---- 获取最值索引
data = np.floor(np.random.normal(85, 3, (3,2)))
df = pd.DataFrame(data, index=['a', 'b', 'c'], columns=['math', 'chinese'])
print(df)
print()
# 列
print(df.max(), df.idxmax())
print()
print(df.min(), df.idxmin())
print()
# 行
print(df.max(axis=1), df.idxmax(axis=1))
print()
print(df.min(axis=1), df.idxmin(axis=1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3.6 median() ---- 求中位数
data = np.floor(np.random.normal(85, 3, (3,2)))
df = pd.DataFrame(data, index=['a', 'b', 'c'], columns=['math', 'chinese'])
print(df)
print()
# 列
print(df.median())
print(df.median(axis=0))
print()
# 行
print(df.median(axis=1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
3.7 value_counts() ---- 求频数
以行为统计单元
data = np.floor(np.random.normal(85, 3, (3,2)))
df = pd.DataFrame(data, index=['a', 'b', 'c'], columns=['math', 'chinese'])
print(df)
print()
print(df.value_counts())
- 1
- 2
- 3
- 4
- 5
3.8 mode() ---- 求众数
data = np.floor(np.random.normal(85, 3, (3,2)))
df = pd.DataFrame(data, index=['a', 'b', 'c'], columns=['math', 'chinese'])
print(df)
print()
print(df.mode())
print()
print(df.mode(axis=1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.9 quantile() ---- 求四分位数
四分位数:把数值从小到大排列并分成四等分,处于三个分割点位置的数值就是四分位数。
- 需要传入一个列表,列表中的元素为要获取的数的对应位置
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data)
print(df)
print()
print(df.quantile([.25, .50, .75, 1]))
print(df.quantile([.25, .50, .75, 1], axis=0))
print(df.quantile([.25, .50, .75, 1], axis=1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.10 std() ---- 标准差
总体标准差是反映研究总体内个体之间差异程度的一种统计指标。
总体标准差计算公式:
S = ∑ ( X i − X ˉ ) 2 n S=\sqrt{\frac{\sum\left(X_{i}-\bar{X}\right)^{2}}{n}} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.6833em;"></span><span class="mord mathnormal" style="margin-right: 0.0576em;">S</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.2778em;"></span></span><span class="base"><span class="strut" style="height: 2.44em; vertical-align: -0.6349em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.8051em;"><span class="svg-align" style="top: -4.4em;"><span class="pstrut" style="height: 4.4em;"></span><span class="mord" style="padding-left: 1em;"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.3852em;"><span class="" style="top: -2.655em;"><span class="pstrut" style="height: 3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.6125em;"><span class="pstrut" style="height: 3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop op-symbol small-op mtight" style="position: relative; top: 0em;">∑</span><span class="minner mtight"><span class="minner mtight"><span class="mopen sizing reset-size3 size6 mtight delimcenter" style="top: 0.075em;"><span class="mtight">(</span></span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right: 0.0785em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.3281em;"><span class="" style="top: -2.357em; margin-left: -0.0785em; margin-right: 0.0714em;"><span class="pstrut" style="height: 2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height: 0.143em;"><span class=""></span></span></span></span></span></span><span class="mbin mtight">−</span><span class="mord accent mtight"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.8201em;"><span class="" style="top: -2.7em;"><span class="pstrut" style="height: 2.7em;"></span><span class="mord mathnormal mtight" style="margin-right: 0.0785em;">X</span></span><span class="" style="top: -2.9523em;"><span class="pstrut" style="height: 2.7em;"></span><span class="accent-body" style="left: -0.1667em;"><span class="mord mtight">ˉ</span></span></span></span></span></span></span><span class="mclose sizing reset-size3 size6 mtight delimcenter" style="top: 0.075em;"><span class="mtight">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 1.1039em;"><span class="" style="top: -3.1436em; margin-right: 0.0714em;"><span class="pstrut" style="height: 2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height: 0.345em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span class="" style="top: -3.7651em;"><span class="pstrut" style="height: 4.4em;"></span><span class="hide-tail" style="min-width: 1.02em; height: 2.48em;"> <svg width="400em" height="2.48em" viewBox="0 0 400000 2592" preserveAspectRatio="xMinYMin slice"> <path d="M424,2478
c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514
c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20
s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121
s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081
l0 -0c4,-6.7,10,-10,18,-10 H400000
v40H1014.6
s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185
c-2,6,-10,9,-24,9
c-8,0,-12,-0.7,-12,-2z M1001 80
h400000v40h-400000z">
由于总体标准差计算出来会偏小,所以采用
( n − d d o f ) (n-ddof) </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right: 0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.2222em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathnormal">dd</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right: 0.1076em;">f</span><span class="mclose">)</span></span></span></span></span>的方式适当扩大标准差,即样本标准差。<br> 样本标准差计算公式:<br> <span class="katex--inline"><span class="katex"><span class="katex-mathml"> S = ∑ ( X i − X ˉ ) 2 n − d d o f S=\sqrt{\frac{\sum\left(X_{i}-\bar{X}\right)^{2}}{n-ddof}} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.6833em;"></span><span class="mord mathnormal" style="margin-right: 0.0576em;">S</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.2778em;"></span></span><span class="base"><span class="strut" style="height: 2.44em; vertical-align: -0.7029em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.7371em;"><span class="svg-align" style="top: -4.4em;"><span class="pstrut" style="height: 4.4em;"></span><span class="mord" style="padding-left: 1em;"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.3852em;"><span class="" style="top: -2.655em;"><span class="pstrut" style="height: 3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">dd</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right: 0.1076em;">f</span></span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.6125em;"><span class="pstrut" style="height: 3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop op-symbol small-op mtight" style="position: relative; top: 0em;">∑</span><span class="minner mtight"><span class="minner mtight"><span class="mopen sizing reset-size3 size6 mtight delimcenter" style="top: 0.075em;"><span class="mtight">(</span></span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right: 0.0785em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.3281em;"><span class="" style="top: -2.357em; margin-left: -0.0785em; margin-right: 0.0714em;"><span class="pstrut" style="height: 2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height: 0.143em;"><span class=""></span></span></span></span></span></span><span class="mbin mtight">−</span><span class="mord accent mtight"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.8201em;"><span class="" style="top: -2.7em;"><span class="pstrut" style="height: 2.7em;"></span><span class="mord mathnormal mtight" style="margin-right: 0.0785em;">X</span></span><span class="" style="top: -2.9523em;"><span class="pstrut" style="height: 2.7em;"></span><span class="accent-body" style="left: -0.1667em;"><span class="mord mtight">ˉ</span></span></span></span></span></span></span><span class="mclose sizing reset-size3 size6 mtight delimcenter" style="top: 0.075em;"><span class="mtight">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 1.1039em;"><span class="" style="top: -3.1436em; margin-right: 0.0714em;"><span class="pstrut" style="height: 2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height: 0.4811em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span class="" style="top: -3.6971em;"><span class="pstrut" style="height: 4.4em;"></span><span class="hide-tail" style="min-width: 1.02em; height: 2.48em;"> <svg width="400em" height="2.48em" viewBox="0 0 400000 2592" preserveAspectRatio="xMinYMin slice"> <path d="M424,2478
c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514
c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20
s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121
s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081
l0 -0c4,-6.7,10,-10,18,-10 H400000
v40H1014.6
s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185
c-2,6,-10,9,-24,9
c-8,0,-12,-0.7,-12,-2z M1001 80
h400000v40h-400000z">
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data)
print(df)
print()
# 总体标准差
print(df.std())
print(df.std(axis=0))
print(df.std(axis=1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data)
print(df)
print()
# 样本标准差
print(df.std(ddof=1))
print(df.std(axis=0,ddof=1))
print(df.std(axis=1,ddof=1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3.11 describe() ---- 统计 DataFrame 的常见统计学指标结果
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data)
print(df)
print()
print(df.describe())
- 1
- 2
- 3
- 4
- 5
3.12 corr() ---- 求每列之间的相关系数矩阵
相关系数:描述两组样本的相关程度的大小
相关系数:协方差除去两组样本标准差的乘积,是一个 [-1, 1] 之间的数
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data)
print(df)
print()
print(df.corr())
- 1
- 2
- 3
- 4
- 5
3.12 cov() ---- 求每列之间的协方差矩阵
协方差:可以评估两组统计数据的相关性
协方差正为正相关,负为反相关。绝对值越大,相关性越强。
计算方法:
- 计算两组样本的均值
- 计算两组样本中的各个元素与均值的差
- 协方差为 两组数据离差的乘积的均值
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data)
print(df)
print()
print(df.cov())
- 1
- 2
- 3
- 4
- 5
3.13 sort_values() ---- 根据元素值进行排序
参数:
- by:指定排序参照的字段
- ascending:True为升序(默认),False为降序
- axis:排序的方向, 0 - 对行进行排序(默认),1 - 对列进行排序
3.13.1 升序
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data, index=['a','b','c','d'], columns=['aa','bb','cc'])
print(df)
print()
# 根据 aa 列对数据进行升序排列
print(df.sort_values(by=['aa']))
# 根据 a 行对数据进行升序排列
print(df.sort_values(by=['a'],axis=1))
# 根据 a 行对数据进行升序排列
print(df.sort_values(by=['a'],axis=1, ascending=True))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
3.13.2 降序
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data, index=['a','b','c','d'], columns=['aa','bb','cc'])
print(df)
print()
# 根据 aa 列对数据进行降序排列
print(df.sort_values(by=['aa'], ascending=False))
# 根据 a 行对数据进行降序排列
print(df.sort_values(by=['a'],axis=1, ascending=False))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3.14 sort_index() ---- 根据索引值进行排序
参数:
- ascending:True为升序(默认),False为降序
- axis:排序的方向, 0 - 对行进行排序(默认),1 - 对列进行排序
3.14.2 升序
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data, index=['b','a','d','e'], columns=['cc','aa','bb'])
print(df)
print()
# 默认对行索引进行升序排列
print(df.sort_index())
# 对行索引进行升序排列
print(df.sort_index(axis=0))
# 对列索引进行升序排列
print(df.sort_index(axis=1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
3.14.2 降序
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data, index=['b','a','d','e'], columns=['cc','aa','bb'])
print(df)
print()
# 默认对行索引进行降序排列
print(df.sort_index(ascending=False))
# 对行索引进行降序排列
print(df.sort_index(axis=0,ascending=False))
# 对列索引进行降序排列
print(df.sort_index(axis=1,ascending=False))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
3.15 apply() ---- 根据传入的函数参数处理 DataFrame 对象
3.15.1 对每列进行处理
def func(x):
print(x.values)
return pd.Series(np.arange(0,x.size))
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data, index=[‘b’,‘a’,‘d’,‘e’], columns=[‘cc’,‘aa’,‘bb’])
print(df)
print()
# 默认对每列进行处理,一次处理一列
# 会返回一个原数组处理后的新数组,不会修改原数组
res = df.apply(func)
print(res)
print(df)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3.15.2 对每行进行处理
def func(x):
print(x.values)
return pd.Series(np.arange(0,x.size))
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data, index=[‘b’,‘a’,‘d’,‘e’], columns=[‘cc’,‘aa’,‘bb’])
print(df)
print()
res = df.apply(func, axis=1)
print(res)
print(df)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
3.16 applymap() ---- 根据传入的函数参数处理 DataFrame 对象的每个元素
按列的方向遍历每个元素进行处理,返回一个处理后的新数组,不会修改原数组。
def func(x):
print(x, end=' ')
if(x>85): return 999
else: return 0
data = np.floor(np.random.normal(85, 3, (4,3)))
df = pd.DataFrame(data, index=[‘b’,‘a’,‘d’,‘e’], columns=[‘cc’,‘aa’,‘bb’])
print(df)
print()
res = df.applymap(func)
print()
print(res)
print(df)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3.17 groupby() ---- 对 DataFrame 对象中的数据进行分组
参数:
- by:指定分组的依据,可以接收的参数类型 list、string、mapping、generator
- axis:操作的轴向,默认对行进行操作,默认为0,接收
- as_index:表示聚合后的聚合标签是否以DataFrame索引形式输出,默认为True
- sort:表示是否对分组依据分组标签进行排序,默认为True
返回 Groupby 对象:
- Groupby.get_group(‘A’):返回A组的详细数据
- Groupby.size():返回每一组的频数
数据:
left = pd.DataFrame({
'student_id':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],
'student_name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung', 'Billy', 'Brian', 'Bran', 'Bryce', 'Betty', 'Emma', 'Marry', 'Allen', 'Jean', 'Rose', 'David', 'Tom', 'Jack', 'Daniel', 'Andrew'],
'class_id':[1,1,1,2,2,2,3,3,3,4,1,1,1,2,2,2,3,3,3,2],
'gender':['M', 'M', 'F', 'F', 'M', 'M', 'F', 'F', 'M', 'M', 'F', 'F', 'M', 'M', 'F', 'F', 'M', 'M', 'F', 'F'],
'age':[20,21,22,20,21,22,23,20,21,22,20,21,22,23,20,21,22,20,21,22],
'score':[98,74,67,38,65,29,32,34,85,64,52,38,26,89,68,46,32,78,79,87]})
left
right = pd.DataFrame({'class_id':[1,2,3,5], 'class_name': ['ClassA', 'ClassB', 'ClassC', 'ClassE']})
right
data = pd.merge(left, right, how='inner', on='class_id')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
3.17.1 分组
# 根据 class_id 进行分组
grouped = data.groupby(by='class_id')
# 获取 class_id 为1的组
print(grouped.get_group(1))
- 1
- 2
- 3
- 4
# 根据 class_id 与 gender 进行分组
grouped = data.groupby(by=['class_id', 'gender'])
# # 获取 class_id gender 为(1, 'M')的组
print(grouped.get_group((1, 'M')))
- 1
- 2
- 3
- 4
print(grouped.size())
- 1
3.17.1 聚合
# 根据 class_id 进行分组
grouped = data.groupby(by='class_id')
# 统计每个班级的平均分
# 传入的字典对应的值为处理的方式
print(grouped.agg({'score': np.mean}))
- 1
- 2
- 3
- 4
- 5
# 统计每个班级的平均分, 以及么每个班级的年龄最大值
print(grouped.agg({'score':np.mean, 'age':np.max}))
- 1
- 2
print(grouped.agg({'score':[np.mean, np.max, np.min], 'age':np.max}))
- 1
3.18 pivot_table() ---- 生成DataFrame对象的透视表
参数:
- index:分组所依据的列
- values:指定需要聚合统计的列
- columns:指定列,依据该列的每个值进行分列统计
- margins:是否对透视表的每行每列进行汇总统计
- aggfunc:聚合要执行的操作
# 根据 class_id 进行分组
# 默认求分组后能进行均值计算的列的均值
print(data.pivot_table(index='class_id') )
- 1
- 2
- 3
# 根据 class_id 进行分组
# 对分组后的数据 score 的聚合操作,默认求均值
print(data.pivot_table(index='class_id', values='score') )
- 1
- 2
- 3
# 根据 class_id gender 进行分组
# 对分组后的数据 score 的聚合操作,默认求均值
# 依据 age 列的每个值进行分列统计
print(
data.pivot_table(
index=['class_id', 'gender'],
values='score',
columns=['age']
)
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
# 根据 class_id gender 进行分组
# 对分组后的数据 score 的聚合操作,默认求均值
# 依据 age 列的每个值进行分列统计
# 对透视表的每行每列进行汇总统
print(
data.pivot_table(
index=['class_id', 'gender'],
values='score',
columns=['age'],
margins=True
)
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
print(
data.pivot_table(
index=['class_id', 'gender'],
values='score',
columns=['age'],
margins=True,
aggfunc='max'
)
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3.19 drop_duplicates ---- 处理重复值
属性:
- subset:接收 string 或 序列 为参数,表示要进行去重的列,默认为None,表示全部的列(只有当一行中所有的列一样,才会对该行进行去重)
- keep:接收 string 为参数,表示重复时保留第几个数据。first:保留第一个。last:保留最后一个。false:只要有重复都不保留。默认为first。
- inplace:表示是否在原表上进行修改。默认为False。
默认情况下,对所有的列进行去重,不在原表上进行修改,有重复值时默认保留重复值的第一个。
l = [
np.array([1,2,3]),
np.array([1,1,2]),
np.array([1,1,2]),
np.array([1,1,1])
]
df = pd.DataFrame(l)
print(df)
print()
print(df.drop_duplicates())
print()
print(df)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
l = [
np.array([1,2,3]),
np.array([1,1,2]),
np.array([1,1,2]),
np.array([1,1,1])
]
df = pd.DataFrame(l)
print(df)
print()
# 在原表上进行修改,无返回值
# 不在原表上进行修改,会返回修改后的新表
print(df.drop_duplicates(subset=[0,1], inplace=True, keep='last'))
print()
print(df)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
3.20 isnull() ---- 判断是否为缺失值
l = [
pd.Series([1,2,3], index=['a', 'b', 'c']),
pd.Series([1,3], index=['a', 'c']),
pd.Series([2,3], index=['b', 'c'])
]
df = pd.DataFrame(l)
print(df)
print()
print(df.isnull())
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3.21 notnull() ---- 判断是否不为缺失值
l = [
pd.Series([1,2,3], index=['a', 'b', 'c']),
pd.Series([1,3], index=['a', 'c']),
pd.Series([2,3], index=['b', 'c'])
]
df = pd.DataFrame(l)
print(df)
print()
print(df.notnull())
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3.22 sum() ---- 求和
l = [
pd.Series([1,2,3], index=['a', 'b', 'c']),
pd.Series([1,3], index=['a', 'c']),
pd.Series([2,3], index=['b', 'c'])
]
df = pd.DataFrame(l)
print(df)
print()
# 默认对每列进行求和
print(df.sum())
# 对每列进行求和
print(df.sum(axis=0))
print()
# 对每行进行求和
print(df.sum(axis=1))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
3.23 dropna() ---- 删除缺失值
参数:
- axis:表示轴向,0为删除行,1为删除列,默认为0.
- how:接收 string 为参数,表示删除的方式,any 表示只要有缺失值就删除该行或列,all表示全部为缺失值才删除行或列。默认为any。
- subset:接收 array 类型的数据为参数,表示进行缺失值处理的行或列,默认为None,表示所有的行或列。
- inplace:表示是否在原表上进行操作,默认为False。
l = [
pd.Series([1,2,3], index=['a', 'b', 'c']),
pd.Series([1,3], index=['a', 'c']),
pd.Series([2,3], index=['b', 'c'])
]
df = pd.DataFrame(l)
print(df)
print()
# 默认执行删除行操作,只要有缺失值就执行删除操作
# 默认对所有的列进行处理
# 默认不在原表上进行修改
print(df.dropna())
print()
print(df)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
l = [
pd.Series([1,2,3], index=['a', 'b'