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 np
def 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.61
c0 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.00
c0 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.537955
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
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: object
c0 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.0
c0 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: int64
sum(axis=0):
c0 18
c1 22
c2 26
dtype: int64
sum(axis=1):
0 3
1 12
2 21
3 30
dtype: int64
prod():
c0 0
c1 280
c2 880
dtype: int64
prod(axis=0):
c0 0
c1 280
c2 880
dtype: int64
prod(axis=1):
0 0
1 60
2 336
3 990
dtype: int64
max():
c0 9
c1 10
c2 11
dtype: int64
min():
c0 0
c1 1
c2 2
dtype: int64
11
11
A 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.0
isnull():
A B C D
0 False False False False
1 False False True False
2 True True True True
3 True False True False
notnull()
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.0
axis=1:
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
0 1 2
1 1.0 None 3.0
A 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.0
A 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