Pandas 数据分析基础操作:从创建到统计的实用指南
本文介绍了使用 Pandas 进行数据分析的基础操作,包括创建 DataFrame、数据描述、处理空值、计算均值与中位数等常见统计方法。我们展示了如何通过 describe()
方法生成描述性统计信息,并详细解释了累加、累乘、最大值、最小值的计算过程。此外,本文还涵盖了如何使用 Pandas 灵活处理空值(如填充或删除 NaN 值),并指出如何找到数据中的最大值或最小值索引位置。这些基础操作是数据分析工作中不可或缺的工具,帮助读者轻松应对各种数据处理任务。
文章目录
- Pandas 数据分析基础操作:从创建到统计的实用指南
- 一 创建和描述 DataFrame
- 名词解释
- 二 均值、中位数和 NaN 值处理
- 三 累加和累乘
- 四 最大值和最小值
- 五 处理空值
- 六 索引最大值和最小值
- 七 完整代码示例
- 八 源码地址
导入库
import pandas as pd
import numpy as np
一 创建和描述 DataFrame
创建一个 DataFrame 来作为示例:
data = np.array([[1.39, 1.77, None],[0.34, 1.91, -0.05],[0.34, 1.47, 1.22],[None, 0.27, -0.61]
])df = pd.DataFrame(data, index=["r0", "r1", "r2", "r3"], columns=["c0", "c1", "c2"])
print(df)
describe()
方法提供了概括每个列分布的描述统计数据:
print(df.describe())
Pandas 还可以很容易地创建一个纯数值 DataFrame,以便进行更好的统计操作:
df1 = pd.DataFrame(np.random.random((4, 3)), columns=["c0", "c1", "c2"])
print(df1.describe())
运行结果
c0 c1 c2
count 4.000000 4.000000 4.000000
mean 0.537270 0.533551 0.498930
std 0.295673 0.374688 0.298645
min 0.314925 0.026976 0.247049
25% 0.322006 0.372198 0.290816
50% 0.444249 0.614003 0.421680
75% 0.659512 0.775355 0.629794
max 0.945659 0.879224 0.905314
名词解释
- count - 非空(非NA)值的数量。这里每一列都有4个非空值。
- mean - 平均值。即每列值的总和除以数量(非空值的数量)。例如,c0列的平均值为0.537270。
- std - 标准差,度量数据的离散程度,即各数据点与平均值的差异。c0列的标准差为0.295673,表示c0列的数据点相对平均值分布的离散程度。
- min - 最小值。每列中的最小值,如c0列的最小值为0.314925。
- 25% - 第25百分位数,也称为下四分位数,表示所有数值中有25%的数据点小于或等于这个值。
- 50% - 中位数或第50百分位数,表示中间值,即有50%的数据点小于或等于此值。它也是数据的中心点。
- 75% - 第75百分位数,也称为上四分位数,表示所有数值中有75%的数据点小于或等于这个值。
- max - 最大值。每列中的最大值,如c0列的最大值为0.945659。
二 均值、中位数和 NaN 值处理
数据分析中最常用的操作之一是计算均值或中位数。
print(df.mean()) # 列均值
print(df.mean(axis=1)) # 行均值
Pandas 可以自动忽略 NaN 值,或者您也可选择包含 NaN 值计算:
df = df.replace({None: np.nan})
print(df.mean(axis=0, skipna=False)) # 不忽略 NaN 值
有时数据偏大不适合普遍现象,比如某些情况下会强制 “被平均” ,这个时候去中位数比较合适。
s = pd.Series([1000, 2000, 4000, 100000])
print("mean():", s.mean())
# 中位数
print("median():", s.median())
三 累加和累乘
Pandas 提供了累加 sum()
和累乘 prod()
方法。
df = pd.DataFrame(np.arange(12).reshape((4, 3)), columns=["c0", "c1", "c2"])
print("sum():\n", df.sum())
print("prod():\n", df.prod())
你还可以根据需要对行 (axis=1
)或者列 (axis=0
)进行计算。
四 最大值和最小值
找出数据的最大和最小值
print("max():\n", df.max())
print("min():\n", df.min())
也可以使用 NumPy 中的展品操作,计算所有数据的最大值。
print(df.values.ravel().max()) # 使用 NumPy 进行总体最大值计算
五 处理空值
数据常常会带有空值,Pandas 提供了各种方法来处理这些问题。
- 辨认空值
print(df.isnull()) # 辨认空值
- 删除含有空值的行或列
print(df.dropna()) # 默认删除含有 NaN 值的行
print(df.dropna(axis=1)) # 删除含有 NaN 值的列
- 填充空值
print(df.fillna(111)) # 将所有 NaN 值填充为指定值
values = {"A": 0, "B": 1, "C": 2, "D": 3}
print(df.fillna(value=values)) # 根据列进行定制填充
- 甚至可以使用另一个 DataFrame 来填充空值
df2 = pd.DataFrame(np.arange(16).reshape((4, 4)), columns=list("ABCD"))
print(df.fillna(df2))
六 索引最大值和最小值
有时候,了解一列数据中最大值或最小值的索引位置是很重要的。
df = pd.DataFrame([[1, 2, 3, 0],[3, 4, None, 1],[3, 5, 2, 1],[3, 2, 2, 3]],columns=list("ABCD"))
print(df.idxmax()) # 找出每列最大值的索引
print(df.idxmin()) # 找出每列最小值的索引
七 完整代码示例
# This is a sample Python script.# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.import pandas as pd
import numpy as npdef print_hi(name):# Use a breakpoint in the code line below to debug your script.print(f'Hi, {name}') # Press ⌘F8 to toggle the breakpoint.# 日常一般用法# 均值中位数# df.mean();df.median()# 累加累乘# df.sum();df.prod()# 最大最小# df.max();# df.min()# 处理空值# df.isnull();# df.notnull();# df.dropna();# df.fillna()# 获取索引# df.idxmin();# df.idxmax()data = np.array([[1.39, 1.77, None],[0.34, 1.91, -0.05],[0.34, 1.47, 1.22],[None, 0.27, -0.61]])# df = pd.DataFrame(data, index=["r0", "r1", "r2", "r3"], columns=["c0", "c1", "c2"], dtype=float)df = pd.DataFrame(data, index=["r0", "r1", "r2", "r3"], columns=["c0", "c1", "c2"])print(df)# 非纯数值型数据print(df.describe())# 纯数值型数据df1 = pd.DataFrame(np.random.random((4, 3)), columns=["c0", "c1", "c2"])print(df1)print("\ndescribe:\n", df1.describe())# 均值中位数,第 0 个维度print(df.mean())print(df.mean(axis=0))# 第 1 个维度求均值print(df.mean(axis=1))# Pandas 遇到 NaN,不计算这列、行的数据print()df = df.replace({None: np.nan})# df = df.dropna()print(df.mean(axis=0, skipna=False))print(df.mean(axis=1, skipna=False))# 最后一个为高收入人s = pd.Series([1000, 2000, 4000, 100000])print("mean():", s.mean()) # 拉高平均收入,拉高仇恨print("median():", s.median()) # 比较合理print()# 累加累乘df = pd.DataFrame(np.arange(12).reshape((4, 3)), columns=["c0", "c1", "c2"])print(df)print("sum():\n", df.sum())print("\nsum(axis=0):\n", df.sum(axis=0))print("\nsum(axis=1):\n", df.sum(axis=1))print("prod():\n", df.prod())print("\nprod(axis=0):\n", df.prod(axis=0))print("\nprod(axis=1):\n", df.prod(axis=1))# 最大最小print("max():\n", df.max())print("\nmin():\n", df.min())print(df.max().max())print(df.values.ravel().max()) # 用 Numpy 的方式运算print()# 处理空值# 查看数据用没有空值df = pd.DataFrame([[1, 2, 3, 0],[3, 4, None, 1],[None, None, None, None],[None, 3, None, 4]],columns=list("ABCD"))print(df)print("\nisnull():\n", df.isnull()) # True 就是空print("\nnotnull()\n", df.notnull()) # False 为空print("默认:\n", df.dropna()) # 默认按 axis=0,删除含有 None 的行print("\naxis=1:\n", df.dropna(axis=1)) # 可以换一个 axis drop# 除掉全为空的数据,只要有值就用df1 = pd.DataFrame([[None, None, None], [1, None, 3]])print(df1.dropna(how="all")) # how 默认为 "any"# 填充 111,对空值进行填充print(df.fillna(111))# 差异化填充values = {"A": 0, "B": 1, "C": 2, "D": 3}print(df.fillna(value=values))# 使用新的 df 来做 nan 填充df2 = pd.DataFrame(np.arange(16).reshape((4, 4)), columns=list("ABCD"))print("df2:\n", df2)print("\nfillna(df2):\n", df.fillna(df2))# 获取索引df = pd.DataFrame([[1, 2, 3, 0],[3, 4, None, 1],[3, 5, 2, 1],[3, 2, 2, 3]],columns=list("ABCD"))print(df)print("\nidxmax():\n", df.idxmax())print("\nidxmax(skipna=False):\n", df.idxmax(skipna=False))print("\nidxmin():\n", df.idxmin())# Press the green button in the gutter to run the script.
if __name__ == '__main__':print_hi('基础统计方法')# See PyCharm help at https://www.jetbrains.com/help/pycharm/
复制粘贴并覆盖到你的 main.py 中运行,运行结果如下。
Hi, 基础统计方法c0 c1 c2
r0 1.39 1.77 None
r1 0.34 1.91 -0.05
r2 0.34 1.47 1.22
r3 None 0.27 -0.61c0 c1 c2
count 3.00 4.00 3.00
unique 2.00 4.00 3.00
top 0.34 1.77 -0.05
freq 2.00 1.00 1.00c0 c1 c2
0 0.945659 0.740733 0.305405
1 0.324367 0.487272 0.247049
2 0.564130 0.879224 0.905314
3 0.314925 0.026976 0.537955describe:c0 c1 c2
count 4.000000 4.000000 4.000000
mean 0.537270 0.533551 0.498930
std 0.295673 0.374688 0.298645
min 0.314925 0.026976 0.247049
25% 0.322006 0.372198 0.290816
50% 0.444249 0.614003 0.421680
75% 0.659512 0.775355 0.629794
max 0.945659 0.879224 0.905314
c0 0.69
c1 1.355
c2 0.186667
dtype: object
c0 0.69
c1 1.355
c2 0.186667
dtype: object
r0 1.58
r1 0.733333
r2 1.01
r3 -0.17
dtype: objectc0 NaN
c1 1.355
c2 NaN
dtype: float64
r0 NaN
r1 0.733333
r2 1.010000
r3 NaN
dtype: float64
mean(): 26750.0
median(): 3000.0c0 c1 c2
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
sum():c0 18
c1 22
c2 26
dtype: int64sum(axis=0):c0 18
c1 22
c2 26
dtype: int64sum(axis=1):0 3
1 12
2 21
3 30
dtype: int64
prod():c0 0
c1 280
c2 880
dtype: int64prod(axis=0):c0 0
c1 280
c2 880
dtype: int64prod(axis=1):0 0
1 60
2 336
3 990
dtype: int64
max():c0 9
c1 10
c2 11
dtype: int64min():c0 0
c1 1
c2 2
dtype: int64
11
11A B C D
0 1.0 2.0 3.0 0.0
1 3.0 4.0 NaN 1.0
2 NaN NaN NaN NaN
3 NaN 3.0 NaN 4.0isnull():A B C D
0 False False False False
1 False False True False
2 True True True True
3 True False True Falsenotnull()A B C D
0 True True True True
1 True True False True
2 False False False False
3 False True False True
默认:A B C D
0 1.0 2.0 3.0 0.0axis=1:Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]0 1 2
1 1.0 None 3.0A B C D
0 1.0 2.0 3.0 0.0
1 3.0 4.0 111.0 1.0
2 111.0 111.0 111.0 111.0
3 111.0 3.0 111.0 4.0A B C D
0 1.0 2.0 3.0 0.0
1 3.0 4.0 2.0 1.0
2 0.0 1.0 2.0 3.0
3 0.0 3.0 2.0 4.0
df2:A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15fillna(df2):A B C D
0 1.0 2.0 3.0 0.0
1 3.0 4.0 6.0 1.0
2 8.0 9.0 10.0 11.0
3 12.0 3.0 14.0 4.0A B C D
0 1 2 3.0 0
1 3 4 NaN 1
2 3 5 2.0 1
3 3 2 2.0 3idxmax():A 1
B 2
C 0
D 3
dtype: int64idxmax(skipna=False):A 1.0
B 2.0
C NaN
D 3.0
dtype: float64idxmin():A 0
B 0
C 2
D 0
dtype: int64
八 源码地址
代码地址:
国内看 Gitee 之 pandas/基础统计方法.py
国外看 GitHub 之 pandas/基础统计方法.py
引用 莫烦 Python