跳至主要內容

Pandas

T4mako大约 21 分钟

Pandas

一、简介

Pandas 是开源的数据分析和数据处理库,基于 Python

Pandas 适用于处理结构化数据

Pandas 主要引入了两种新的数据结构:

  • Series(一维)

类似于一维数组,由一组数据以及与之相关的数据标签(索引)构成

Series 可以看作是 DataFrame 中的一列,也可以是单独存在的一维数据结构

  • DataFrame (二维)

    类似于一个二维表格,它是 Pandas 中最重要的数据结构。

    DataFrame 既有行索引也有列索引

    DataFrame 可视为由多个 Series 组成的数据结构

Pandas 提供了丰富的功能,包括:

  • 数据清洗:处理缺失数据、重复数据等。
  • 数据转换:改变数据的形状、结构或格式。
  • 数据分析:进行统计分析、聚合、分组等。
  • 数据可视化:通过整合 Matplotlib 和 Seaborn 等库,可以进行数据可视化。

二、Series

Series 特点:

  • 一维数组
  • 索引: 每个 Series 都有一个索引,它可以是整数、字符串、日期等类型。如果不指定索引,Pandas 将默认创建一个从 0 开始的整数索引
  • 数据类型: Series 可以容纳不同数据类型的元素
  • **大小不变性:**Series 的大小在创建后是不变的,但可以通过某些操作(如 append 或 delete)来改变。
  • **操作:**Series 支持各种操作,如数学运算、统计分析、字符串处理等。
  • **缺失数据:**Series 可以包含缺失数据,Pandas 使用 NaN(Not a Number)来表示缺失或无值。

Series 创建

使用 pd.Series() 构造函数创建一个 Series 对象,传递一个数据数组(可以是列表、NumPy 数组等)和一个可选的索引数组

pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
  • data:Series 数据部分,可以是列表、数组、字典、标量值等。如果不提供此参数,则创建一个空的 Series。
  • index:Series 索引部分,可以是列表、数组、索引对象等。如果不提供此参数,则创建一个默认的整数索引。
  • dtype:指定 Series 的数据类型。可以是 NumPy 的数据类型,例如 np.int64np.float64 等。如果不提供此参数,则根据数据自动推断数据类型。
  • name:Series 的名称,用于标识 Series 对象。如果提供了此参数,则创建的 Series 对象将具有指定的名称。
  • copy:是否复制数据。默认为 False,表示不复制数据。如果设置为 True,则复制输入的数据。
  • fastpath:是否启用快速路径。默认为 False。启用快速路径可能会在某些情况下提高性能。
import pandas as pd

# 创建 Series1 
a = [1, 2, 3]
myvar = pd.Series(a)
'''
0    1
1    2
2    3
dtype: int64
'''
print(myvar)
print(myvar[1]) # 2



# 指定索引
a = ["Google", "Runoob", "Wiki"]
myvar = pd.Series(a, index = ["x", "y", "z"])
'''
x    Google
y    Runoob
z      Wiki
dtype: object
'''
print(myvar)
print(myvar["y"]) # Runoob

# 使用 key/value 对象,类似字典来创建 Series
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites)
'''
1    Google
2    Runoob
3      Wiki
dtype: object
'''
print(myvar)

# 如果我们只需要字典中的一部分数据,只需要指定需要数据的索引即可,如下实例
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites, index = [1, 2])
'''
1    Google
2    Runoob
dtype: object
'''
print(myvar)

# 使用列表、字典或数组创建一个默认索引的 Series
# 使用列表创建 Series
s = pd.Series([1, 2, 3, 4])
# 使用 NumPy 数组创建 Series
s = pd.Series(np.array([1, 2, 3, 4]))
# 使用字典创建 Series
s = pd.Series({'a': 1, 'b': 2, 'c': 3, 'd': 4})


Series 数据增删改查

# 指定索引创建 Series
s = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])

# 获取值
print(s[2])  # 获取索引为 2 的值
print(s['c'])  # 返回索引标签 'a' 对应的元素

# 获取多个值
subset = s[1:4]  # 获取索引为1到3的值

# 索引和值的对应关系
for index, value in s.items():
    print(f"Index: {index}, Value: {value}")


# 使用切片语法来访问 Series 的一部分
print(s['a':'c'])  # 返回索引标签 'a' 到 'c' 之间的元素
print(s[:3])  # 返回前三个元素

# 为特定的索引标签赋值
s['a'] = 10  # 将索引标签 'a' 对应的元素修改为 10

# 通过赋值给新的索引标签来添加元素
s['e'] = 5  # 在 Series 中添加一个新的元素,索引标签为 'e'

# 使用 del 删除指定索引标签的元素。
del s['a']  # 删除索引标签 'a' 对应的元素

# 使用 drop 方法删除一个或多个索引标签,并返回一个新的 Series。
s_dropped = s.drop(['b'])  # 返回一个删除了索引标签 'b' 的新 Series

Series 基本运算

# 算术运算
result = series * 2  # 所有元素乘以2
# 过滤
filtered_series = series[series > 2]  # 选择大于2的元素
# 数学函数
import numpy as np
result = np.sqrt(series)  # 对每个元素取平方根

# 其他属性和方法
print(s.dtype)   # 数据类型
print(s.shape)   # 形状
print(s.size)    # 元素个数
print(s.head())  # 前几个元素,默认是前 5 个
print(s.tail())  # 后几个元素,默认是后 5 个
print(s.sum())   # 求和
print(s.mean())  # 平均值
print(s.std())   # 标准差
print(s.min())   # 最小值
print(s.max())   # 最大值

Series 属性与方法

# 获取索引
index = s.index # ['b', 'c', 'd', 'e']

# 获取值数组
values = s.values

# 获取描述统计信息
stats = s.describe()

# 获取最大值和最小值的索引
max_index = s.idxmax()
min_index = s.idxmin()

# 使用布尔表达式:根据条件过滤 Series
print(s > 2)  # 返回一个布尔 Series,其中的元素值大于 2

# 查看数据类型:使用 dtype 属性查看 Series 的数据类型
print(s.dtype)  # 输出 Series 的数据类型

# 转换数据类型:使用 astype 方法将 Series 转换为另一种数据类型
s = s.astype('float64')  # 将 Series 中的所有元素转换为 float64 类型

三、DataFrame

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。

DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

DataFrame 特点:

  • 二维结构
  • 列的数据类型可以不同
  • 拥有行和列索引
  • 动态添加删除列
  • 算术运算、数据对齐自动对齐索引
  • 包含缺失数据 NaN
  • 支持数据切片、索引、子集分割等操作
  • 时间序列支持
  • 丰富的数据访问功能:通过 .loc.iloc.query() 方法,可以灵活地访问和筛选数据。
  • 灵活的数据处理功能:包括数据合并、重塑、透视、分组和聚合等。
  • 数据可视化:虽然 DataFrame 本身不是可视化工具,但它可以与 Matplotlib 或 Seaborn 等可视化库结合使用,进行数据可视化。
  • 高效的数据输入输出:可以方便地读取和写入数据,支持多种格式,如 CSV、Excel、SQL 数据库和 HDF5 格式。
  • 描述性统计:提供了一系列方法来计算描述性统计数据,如 .describe().mean().sum() 等。
  • 灵活的数据对齐和集成:可以轻松地与其他 DataFrameSeries 对象进行合并、连接或更新操作。
  • 转换功能:可以对数据集中的值进行转换,例如使用 .apply() 方法应用自定义函数。
  • 滚动窗口和时间序列分析:支持对数据集进行滚动窗口统计和时间序列分析。

DateFrom 创建

DataFrame 构造方法:

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

参数说明:

  • data:DataFrame 数据部分,如果不提供此参数,则创建一个空的 DataFrame。
  • index:DataFrame 的行索引,如果不提供此参数,则创建一个默认的整数索引。
  • columns:DataFrame 的列索引,如果不提供此参数,则创建一个默认的整数索引。
  • dtype:指定 DataFrame 的数据类型,可以是 NumPy 的数据类型,如果不提供此参数,则根据数据自动推断数据类型。
  • copy:是否复制数据。默认为 False。

创建说明:

  • **从字典创建:**字典的键成为列名,值成为列数据
  • **从列表创建:**外层列表代表行,内层列表代表列
  • **从 NumPy 数组创建:**提供一个二维 NumPy 数组
  • **从 Series 创建 DataFrame:**通过 pd.Series() 创建
import pandas as pd
import numpy as np

data = [['Google', 10], ['Runoob', 12], ['Wiki', 13]]
# 创建 DataFrame
df = pd.DataFrame(data, columns=['Site', 'Age'])
# 使用 astype 方法设置每列的数据类型
df['Site'] = df['Site'].astype(str)
df['Age'] = df['Age'].astype(float)
'''
     Site   Age
0  Google  10.0
1  Runoob  12.0
2    Wiki  13.0
'''
print(df)

# 使用字典来创建
import pandas as pd
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)

# 通过 NumPy 数组创建 DataFrame
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))

# 从 Series 创建 DataFrame
s1 = pd.Series(['Alice', 'Bob', 'Charlie'])
s2 = pd.Series([25, 30, 35])
s3 = pd.Series(['New York', 'Los Angeles', 'Chicago'])
df = pd.DataFrame({'Name': s1, 'Age': s2, 'City': s3})

以下实例使用 ndarrays 创建,ndarray 的长度必须相同, 如果传递了 index,则索引的长度应等于数组的长度。如果没有传递索引,则默认情况下,索引将是 range(n),其中 n 是数组长度。

# 创建一个包含网站和年龄的二维 ndarray
ndarray_data = np.array([
    ['Google', 10],
    ['Runoob', 12],
    ['Wiki', 13]
])
# 使用DataFrame构造函数创建数据帧
df = pd.DataFrame(ndarray_data, columns=['Site', 'Age'])
# 打印数据帧
print(df)

Pandas 可以使用 loc 属性返回指定行的数据

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)

# 返回第一行,返回结果其实就是一个 Pandas Series 数据
'''
calories    420
duration     50
Name: 0, dtype: int64
'''
print(df.loc[0])
# 返回第二行
print(df.loc[1])

# 使用 [[ ... ]] 格式,返回多行数据
# 返回第一行和第二行,返回结果其实就是一个 Pandas DataFrame 数据
print(df.loc[[0, 1]])

指定索引值

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}
df = pd.DataFrame(data, index = ["day1", "day2", "day3"])

使用 loc 属性返回指定索引对应到某一行

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}
df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
# 指定索引
print(df.loc["day2"])

DataFrame 的属性和方法

# DataFrame 的属性和方法

print(df.shape)     # 形状,两个数的数组,[行数,列数]
print(df.columns)   # 列名
print(df.index)     # 索引
print(df.head())    # 前几行数据,默认是前 5 行
print(df.tail())    # 后几行数据,默认是后 5 行
print(df.info())    # 数据信息
print(df.describe())# 描述统计信息
print(df.mean())    # 求平均值
print(df.sum())     # 求和

DataFrame 增删改查

访问列:使用列名作为属性或通过 .loc[].iloc[] 访问,也可以使用标签或位置索引

# 通过列名访问
print(df['Column1'])

# 通过属性访问
print(df.Name)     
   
# 通过 .loc[] 访问
print(df.loc[:, 'Column1'])

# 通过 .iloc[] 访问
print(df.iloc[:, 0])  # 带索引的

# 访问单个元素
print(df['Name'][0])

**访问行:**使用行的标签和 .loc[] 访问。

# 第一行,列名为 Col1 的值
print(df.loc[0, 'col']) 

**修改列数据:**直接对列进行赋值

df['Column1'] = [10, 11, 12]

**添加新列:**给新列赋值。

df['NewColumn'] = [100, 200, 300]

**添加新行:**使用 loc、append 或 concat 方法。

# 使用 loc 为特定索引添加新行
df.loc[3] = [13, 14, 15, 16]

# 使用 append 添加新行到末尾
new_row = {'Column1': 13, 'Column2': 14, 'NewColumn': 16}
df = df.append(new_row, ignore_index=True)

append() 方法在 pandas 版本 1.4.0 中已经被标记为弃用,推荐使用 concat()

# 使用concat添加新行
new_row = pd.DataFrame([[4, 7]], columns=['A', 'B'])  # 创建一个只包含新行的DataFrame
df = pd.concat([df, new_row], ignore_index=True)  # 将新行添加到原始DataFrame

**删除列:**使用 drop 方法。

df_dropped = df.drop('Column1', axis=1)

**删除行:**同样使用 drop 方法。

df_dropped = df.drop(0)  # 删除索引为 0 的行

DataFrame 的统计分析

**描述性统计:**使用 .describe() 查看数值列的统计摘要。

df.describe()

**计算统计数据:**使用聚合函数如 .sum()、.mean()、.max() 等。

df['Column1'].sum()
df.mean()

DataFrame 的索引操作

**重置索引:**使用 .reset_index()

df_reset = df.reset_index(drop=True)

**设置索引:**使用 .set_index()

df_set = df.set_index('Column1')

DataFrame 的布尔索引

使用布尔表达式:根据条件过滤 DataFrame。

df['Column1'] > 2 # 布尔数组
df[df['Column1'] > 2]

DataFrame 的数据类型

查看数据类型:使用 dtypes 属性。

df.dtypes

**转换数据类型:**使用 astype 方法。

df['Column1'] = df['Column1'].astype('float64')

DataFrame 的合并与分割

**合并:**使用 concatmerge 方法。

# 纵向合并
pd.concat([df1, df2], ignore_index=True)

# 横向合并
pd.merge(df1, df2, on='Column1')

**分割:**使用 pivot、melt 或自定义函数。

# 长格式转宽格式
df_pivot = df.pivot(index='Column1', columns='Column2', values='Column3')

# 宽格式转长格式
df_melt = df.melt(id_vars='Column1', value_vars=['Column2', 'Column3'])

DataFrame 索引和切片

DataFrame 支持对行和列进行索引和切片操作。

# 索引和切片
print(df[['Name', 'Age']]) # 提取多列
print(df[1:3])        # 切片行
print(df.loc[:, 'Name'])   # 提取单列
print(df.loc[1:2, ['Name', 'Age']]) # 标签索引提取指定行列
print(df.iloc[:, 1:])     # 位置索引提取指定列

四、Pandas CSV

读取与保存

Pandas 可以很方便的处理 CSV 文件,使用 read_csv(file/url) 方法读取文件或 url

import pandas as pd

df = pd.read_csv('nba.csv')

print(df.to_string())

to_string() 用于返回 DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 ... 代替。

也可以使用 to_csv() 方法将 DataFrame 存储为 csv 文件:

# 三个字段 name, site, age
name = ["Google", "Runoob", "Taobao", "Wiki"]
st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
ag = [90, 40, 80, 98]
   
# 字典
dict = {'name': name, 'site': st, 'age': ag} 
     
df = pd.DataFrame(dict)
  
# 保存 dataframe
df.to_csv('site.csv')

数据处理

head( n ) 方法用于读取前面的 n 行,如果不填参数 n ,默认返回 5 行。

df = pd.read_csv('nba.csv')
print(df.head())
print(df.head(10))

tail( n ) 方法用于读取尾部的 n 行,如果不填参数 n ,默认返回 5 行,空行各个字段的值返回 NaN

df = pd.read_csv('nba.csv')
print(df.tail())

info() 方法返回表格的一些基本信息

df = pd.read_csv('nba.csv')
print(df.info())

五、Pandas Json

读取与保存

使用 read_json(file/url) 方法读取文件或 url

import pandas as pd
df = pd.read_json('sites.json')
print(df.to_string())

to_string() 用于返回 DataFrame 类型的数据,我们也可以直接处理 JSON 字符串

直接处理 json 数据

data =[
    {
      "id": "A001",
      "name": "菜鸟教程",
      "url": "www.runoob.com",
      "likes": 61
    },
    {
      "id": "A002",
      "name": "Google",
      "url": "www.google.com",
      "likes": 124
    },
    {
      "id": "A003",
      "name": "淘宝",
      "url": "www.taobao.com",
      "likes": 45
    }
]
df = pd.DataFrame(data)

print(df)

可以使用 Python JSON 模块进行数据预处理

六、数据清洗

Pandas 清洗空值

如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

**注意:**默认情况下,dropna() 方法返回一个新的 DataFrame,不会修改源数据。

参数说明:

  • axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
  • how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how='all' 一行(或列)都是 NA 才去掉这整行。
  • thresh:设置需要多少非空值的数据才可以保留下来的。
  • subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
  • inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。

我们可以通过 isnull() 判断各个单元格是否为空。

df = pd.read_csv('property-data.csv')

print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())

指定空数据的值:

missing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values = missing_values)

print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())

删除包含空数据的行

df = pd.read_csv('property-data.csv')
new_df = df.dropna()
print(new_df.to_string())

删除指定列有空值的行

df = pd.read_csv('property-data.csv')
df.dropna(subset=['ST_NUM'], inplace = True)
print(df.to_string())

使用 fillna() 方法替换空字段

df = pd.read_csv('property-data.csv')
df.fillna(12345, inplace = True) # 用 12345 替换空字段
print(df.to_string())

指定某一个列来替换数据

df = pd.read_csv('property-data.csv')
df['PID'].fillna(12345, inplace = True)
print(df.to_string())

替换空单元格的常用方法是计算列的 均值中位数值 或 众数

Pandas使用 mean()median()mode() 方法计算列的均值、中位数值和众数。

df = pd.read_csv('property-data.csv')
x = df["ST_NUM"].mean() # x = df["ST_NUM"].median(),x = df["ST_NUM"].mode()
df["ST_NUM"].fillna(x, inplace = True)
print(df.to_string())

Pandas 清洗格式错误数据

可以通过包含空单元格的行,或者将列中的所有单元格转换为相同格式的数据

以下实例会格式化日期:

# 第三个日期格式错误
data = {
  "Date": ['2020/12/01', '2020/12/02' , '20201226'],
  "duration": [50, 40, 45]
}

df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
df['Date'] = pd.to_datetime(df['Date'], format='mixed')
'''
       Date  duration
day1 2020-12-01        50
day2 2020-12-02        40
day3 2020-12-26        45
'''
print(df.to_string())

Pandas 清洗错误数据

对错误的数据进行 替换移除

手动替换

person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 40, 12345]    # 12345 年龄数据是错误的
}
df = pd.DataFrame(person)
df.loc[2, 'age'] = 30 # 修改数据
print(df.to_string())

设置条件语句

# 将 age 大于 120 的设置为 120
person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 200, 12345]    
}
df = pd.DataFrame(person)

for x in df.index:
  if df.loc[x, "age"] > 120:
    df.loc[x, "age"] = 120
print(df.to_string())

将错误数据的行删除

# 将 age 大于 120 的删除
person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 40, 12345]    # 12345 年龄数据是错误的
}
df = pd.DataFrame(person)
for x in df.index:
  if df.loc[x, "age"] > 120:
    df.drop(x, inplace = True)
print(df.to_string())

Pandas 清洗重复数据

要清洗重复数据,可以使用 duplicated()drop_duplicates() 方法

如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False。

person = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]  
}
df = pd.DataFrame(person)
'''
0    False
1    False
2     True
3    False
dtype: bool
'''
print(df.duplicated())

删除重复数据,可以直接使用 drop_duplicates() 方法。

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
  • subset : 用来指定特定的列,默认所有列
  • keep : 默认 first,删除重复项并保留第一次出现的项,可选值为 {‘first’, ‘last’, False},
  • inplace :默认 False ,返回新的 DataFrame,否则修改原来的数据
persons = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]  
}
df = pd.DataFrame(persons)
df.drop_duplicates(inplace = True)
'''
     name  age
0  Google   50
1  Runoob   40
3  Taobao   23
'''
print(df)

七、常用函数

数据结构

  • 重命名列:

    Dataframe.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='raise')
    
    df = df.rename(
            columns={
                "id": "student_id",
                "first": "first_name",
                "last": "last_name",
                "age": "age_in_years",
            }
        )
    
  • 改变数据类型

    DataFrame.astype(dtype, copy=True, errors='raise')
    
    • dtype: 它是一种数据类型,或列名->数据类型的字典。
    • copy: 默认情况下,astype 总是返回新分配的对象。如果 copy 设置为 False,则只有在旧对象无法强制转换为所需类型的情况下才会创建新对象。
    • errors: 控制对提供的数据类型的无效数据引发异常。默认设置为 raise,表示会引发异常。
    students = students.astype({'grade': int})
    
  • 数据透视(行变列)

    pivot 函数: 在 pandas 中 pivot 函数被用来基于列的值重塑数据并且在外部得到一个新的 DataFrame。pivot 采用我们将使用的以下参数:

    • index: 确定新 DataFrame 中的行。
    • columns: 确定新 DataFrame 中的列。
    • values: 指定重塑表格时要使用的值。
    new_df = df.pivot(index='month', columns='city', values='temperature')
    
  • 数据融合(列变行)

    melt 函数: pandas 的 melt 函数用于转换或重塑数据。它将 DataFrame 从宽格式(列表示多个变量)更改为长格式(每行表示一个唯一变量)

    melt 函数参数定义:

    • id_vars:指定应该保持不变的列。
    • value_vars:指定要“melt”或将其整形成行的列。
    • var_name:这是将存储来自 value_vars 的标头名称的新列的名称。
    • value_name:这是将存储 value_vars 中的值的新列的名称。
    new_df = df.pivot(index='month', columns='city', values='temperature')
    

读取数据

函数说明
pd.read_csv(filename)读取 CSV 文件;
pd.read_excel(filename)读取 Excel 文件;
pd.read_sql(query, connection_object)从 SQL 数据库读取数据;
pd.read_json(json_string)从 JSON 字符串中读取数据;
pd.read_html(url)从 HTML 页面中读取数据。
import pandas as pd

# 从 CSV 文件中读取数据
df = pd.read_csv('data.csv')

# 从 Excel 文件中读取数据
df = pd.read_excel('data.xlsx')

# 从 SQL 数据库中读取数据
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM table_name', conn)

# 从 JSON 字符串中读取数据
json_string = '{"name": "John", "age": 30, "city": "New York"}'
df = pd.read_json(json_string)

# 从 HTML 页面中读取数据
url = 'https://www.runoob.com'
dfs = pd.read_html(url)
df = dfs[0] # 选择第一个数据框

查看数据

函数说明
df.head(n)显示前 n 行数据;
df.tail(n)显示后 n 行数据;
df.infoopen in new window()显示数据的信息,包括列名、数据类型、缺失值等;
df.describe()显示数据的基本统计信息,包括均值、方差、最大值、最小值等;
df.shape显示数据的行数和列数。
# 显示前五行数据
df.head()

# 显示后五行数据
df.tail()

# 显示数据信息
df.info()

# 显示基本统计信息
df.describe()

# 显示数据的行数和列数
df.shape

数据清洗

函数说明
df.dropna()删除包含缺失值的行或列;
df.fillna(value)将缺失值替换为指定的值;
df.replace(old_value, new_value)将指定值替换为新值;
df.duplicated()检查是否有重复的数据;
df.drop_duplicates()删除重复的数据。
# 删除包含缺失值的行或列
df.dropna()

# 将缺失值替换为指定的值
df.fillna(0)

# 将指定值替换为新值
df.replace('old_value', 'new_value')

# 检查是否有重复的数据
df.duplicated()

# 删除重复的数据
df.drop_duplicates()

数据选择和切片

函数说明
df[column_name]选择指定的列;
df.loc[row_index, column_name]通过标签选择数据;
df.iloc[row_index, column_index]通过位置选择数据;
df.ix[row_index, column_name]通过标签或位置选择数据;
df.filter(items=[column_name1, column_name2])选择指定的列;
df.filter(regex='regex')选择列名匹配正则表达式的列;
df.sample(n)随机选择 n 行数据。
# 选择指定的列
df['column_name']

# 通过标签选择数据
df.loc[row_index, column_name]

# 通过位置选择数据
df.iloc[row_index, column_index]

# 通过标签或位置选择数据
df.ix[row_index, column_name]

# 选择指定的列
df.filter(items=['column_name1', 'column_name2'])

# 选择列名匹配正则表达式的列
df.filter(regex='regex')

# 随机选择 n 行数据
df.sample(n=5)

数据排序

函数说明
df.sort_values(column_name)按照指定列的值排序;
df.sort_values([column_name1, column_name2], ascending=[True, False])按照多个列的值排序;
df.sort_index()按照索引排序。
# 按照指定列的值排序
df.sort_values('column_name')

# 按照多个列的值排序
df.sort_values(['column_name1', 'column_name2'], ascending=[True, False])

# 按照索引排序
df.sort_index()

数据分组和聚合

函数说明
df.groupby(column_name)按照指定列进行分组;
df.aggregate(function_name)对分组后的数据进行聚合操作;
df.pivot_table(values, index, columns, aggfunc)生成透视表。
# 按照指定列进行分组
df.groupby('column_name')

# 对分组后的数据进行聚合操作
df.aggregate('function_name')

# 生成透视表
df.pivot_table(values='value', index='index_column', columns='column_name', aggfunc='function_name')

数据合并

函数说明
pd.concat([df1, df2])将多个数据框按照行或列进行合并;
pd.merge(df1, df2, on=column_name)按照指定列将两个数据框进行合并。
# 将多个数据框按照行或列进行合并
df = pd.concat([df1, df2])

# 按照指定列将两个数据框进行合并
df = pd.merge(df1, df2, on='column_name')

数据选择和过滤

函数说明
df.loc[row_indexer, column_indexer]按标签选择行和列。
df.iloc[row_indexer, column_indexer]按位置选择行和列。
df[df['column_name'] > value]选择列中满足条件的行。
df.query('column_name > value')使用字符串表达式选择列中满足条件的行。

数据统计和描述

函数说明
df.describe()计算基本统计信息,如均值、标准差、最小值、最大值等。
df.mean()计算每列的平均值。
df.median()计算每列的中位数。
df.mode()计算每列的众数。
df.count()计算每列非缺失值的数量。

八、相关性分析

据相关性是一项重要的分析任务,它帮助我们理解数据中各个变量之间的关系

Pandas 使用 corr() 方法计算数据集中每列之间的关系

df.corr(method='pearson', min_periods=1)
  • method (可选): 字符串类型,用于指定计算相关系数的方法。默认是 'pearson',还可以选择 'kendall'(Kendall Tau 相关系数)或 'spearman'(Spearman 秩相关系数)。
  • min_periods (可选): 表示计算相关系数时所需的最小观测值数量。默认值是 1,即只要有至少一个非空值,就会进行计算。如果指定了 min_periods,并且在某些列中的非空值数量小于该值,则相应列的相关系数将被设为 NaN。

df.corr() 方法返回一个相关系数矩阵,矩阵的行和列对应数据框的列名,矩阵的元素是对应 列之间的相关系数

常见的相关性系数包括 Pearson 相关系数和 Spearman 秩相关系数:

  • Pearson 相关系数: 即皮尔逊相关系数,用于衡量了两个变量之间的线性关系强度和方向。它的取值范围在 -1 到 1 之间,其中 -1 表示完全负相关,1 表示完全正相关,0 表示无线性相关。可以使用 corr() 方法计算数据框中各列之间的 Pearson 相关系数。
  • **Spearman 相关系数:**即斯皮尔曼相关系数,是一种秩相关系数。用于衡量两个变量之间的单调关系,即不一定是线性关系。它通过比较变量的秩次来计算相关性。可以使用 corr(method='spearman') 方法计算数据框中各列之间的 Spearman 相关系数。

九、其他函数

一般函数

pandas.get_dummiesopen in new window

独热编码,将值用 0,1 表示

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.5