Pandas 数据分析基础操作:从创建到统计的实用指南

时间:2024-10-29 20:48:49

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