本文标题:Pandas数据处理基础

本文链接:http://7r4ck3r.top/index.php/archives/18/

除非另有说明,本作品遵循CC 4.0 BY-SA 版权协议

声明:转载请注明文章来源。

本文章参考蓝桥云课,csdn,百度。

介绍

Pandas 是一个非常著名的开源数据处理库,专为数据分析任务设计。基于 NumPy 开发的 Pandas 是 Scipy 生态系统的一部分,提供了高效处理大型数据集的函数和方法。Pandas 允许用户快速读取、转换、过滤和分析数据集,并拥有强大的缺失数据处理和数据透视功能,使其成为数据预处理的必备工具。

Pandas 的优势和核心在于其特有的数据结构。用户可以将任意格式的数据转换为 Pandas 的数据类型,然后使用 Pandas 提供的方法进行各种操作,最终获得所需的结果。

数据类型

Pandas 的数据类型主要有以下几种,它们分别是:Series(一维数组),DataFrame(二维数组),Panel(三维数组),Panel4D(四维数组),PanelND(更多维数组)。其中 Series 和 DataFrame 应用的最为广泛,几乎占据了使用频率 90% 以上。

Series

Series是 Pandas 中最基本的一维数组形式。其可以储存整数、浮点数、字符串等类型的数据。Series 基本结构如下:

pandas.Series(data=None, index=None)
data是字典,index是索引

举个例子

import pandas as pd

s = pd.Series({'a':1,'b':2,'c':3,'d':4})
print(s)

a    1
b    2
c    3
d    4
dtype: int64
#数值为1,2,3,4,索引是a,b,c,d。类型是int64



import numpy as np
import pandas as pd
s = pd.Series(np.random.randn(5))
print(s)

0   -0.168578
1    0.319380
2   -0.846043
3    0.190392
4   -0.172694
dtype: float64

DataFrame

DataFrame 是 Pandas 中最常见、最重要且使用频率最高的数据结构。它类似于电子表格或 SQL 表结构,可以看作是由多个 Series 拼合而成的扩展类型。与 Series 的直观区别在于,DataFrame 中的数据不仅具有行索引,还具有列索引。这种结构使得 DataFrame 非常适合用于处理和分析结构化数据。
pandas.DataFrame(data=None, index=None, columns=None) #columns 列索引

当不指定索引时,DataFrame 的索引同样是从 0 开始
DataFrame和Series的不同主要在于,后者没有列索引

例子

import pandas as pd
df = pd.DataFrame({'one': pd.Series([1, 2, 3]),
                   'two': pd.Series([4, 5, 6])})
print(df)




   one  two
0    1    4
1    2    5
2    3    6


import pandas as pd
df = pd.DataFrame({'one': [1, 2, 3],
                   'two': [4, 5, 6]})
print(df)



   one  two
0    1    4
1    2    5
2    3    6



import numpy as np
import pandas as pd
a = pd.DataFrame(np.random.randint(5, size=(2, 4))) # 是调用 numpy 库生成一个 2 行 4 列的数组,其中每个元素都是从 0 到 4(包括 0,不包括 5)之间的随机整数。pd.DataFrame(...) 是调用 pandas 库将上述生成的 numpy 数组转换为一个 pandas 数据框。
print(a)

   0  1  2  3
0  3  4  0  4
1  3  4  2  4
random.randint()方法

random.randint(start, stop)

start -- 必需, 一个整数,指定开始值(包含在范围内),即生成的随机整数可以取到这个值。
stop -- 必需, 一个整数,指定结束值(包含在范围内),即生成的随机整数可以取到这个值。

数据读取

我们想要使用 Pandas 来分析数据,那么首先需要读取数据。大多数情况下,数据都来源于外部的数据文件或者数据库。Pandas 提供了一系列的方法来读取外部数据,非常全面。下面,我们以最常用的 CSV 数据文件为例进行介绍。
读取数据 CSV 文件的方法是 pandas.read_csv(),你可以直接传入一个相对路径,或者是网络 URL

df = pd.read_csv('csv文件的路径', encoding='编码格式') #读取
df.to_csv('文件要保存到的路径') #保存

基本操作

df.head()  # 默认显示前 5 条
df.tail(7)  # 指定显示后 7 条
df.describe() #数据概览
df.values #将 DataFrame 转换为 NumPy 数组
df.index  # 查看索引
df.columns  # 查看列名
df.shape  # 查看形状

排序

sort_index()、sort_values()

  1. sort_index()
    是按照索引(行或列)排序
    sort_index(axis=0) --- 行排序
    sort_index(axis=1) --- 列排序
  2. sort_values()
    按照列或者值排序
    sort_values(by,axis = 0,ascending = True,inplace = False,kind =' quicksort ',na_position ='last' )

by: str或str的列表,如果axis=0或axis='index',那么by='列名';如果axis=1或axis='columns',那么by='行名'

axis: {0或'index';1或'columns'} 默认为0,即纵向排序,如果为1,则为横向排序

ascending: 布尔型,默认为True,即升序

inplace: 布尔型,是否用排序后的数据代替现有数据

数据选择

import pandas as pd
import numpy as np
dates = pd.date_range('20240806', periods=6)

df = pd.DataFrame(np.arange(18).reshape((6, 3)), index=dates, columns=['A', 'B', 'C'])
"""np.arange(18)默认起点为0,步长1;reshape 6行3列"""
print(df)

            A   B   C
2024-08-06   0   1   2
2024-08-07   3   4   5
2024-08-08   6   7   8
2024-08-09   9  10  11
2024-08-10  12  13  14
2024-08-11  15  16  17

获取前两行

print(df[0:2])

            A   B   C
2024-08-06   0   1   2
2024-08-07   3   4   5

基于索引数字选择(iloc)

Pandas 中创建一个 DataFrame 后,如果没有明确指定行索引或列标签,Pandas 默认会将行索引设为从 0 开始的整数序列,而列标签则为数据集的第一行内容。此外,每一列也有一个隐式的数字索引,从 0 开始,只是默认情况下不显示出来。

为了基于数字索引选择数据,可以使用 .iloc 方法。以下是 .iloc 方法可以接受的不同类型的参数及其使用方式:

选择单行或单列
# 选择第 0 行
row_0 = df.iloc[0]
print(row_0)

输出:
A    0
B    1
C    2
Name: 2024-08-06 00:00:00, dtype: int64


# 选择第 0 列
col_0 = df.iloc[:, 0]
print(col_0)

输出:
2024-08-06     0
2024-08-07     3
2024-08-08     6
2024-08-09     9
2024-08-10    12
2024-08-11    15
Freq: D, Name: A, dtype: int64
选择多行或多列
# 选择第 0 行和第 1 行
rows_0_1 = df.iloc[[0, 1]]
print(rows_0_1)


输出

            A  B  C
2024-08-06  0  1  2
2024-08-07  3  4  5


# 选择第 0 列和第 1 列
cols_0_1 = df.iloc[:, [0, 1]]
print(cols_0_1)

输出:
             A   B
2024-08-06   0   1
2024-08-07   3   4
2024-08-08   6   7
2024-08-09   9  10
2024-08-10  12  13
2024-08-11  15  16
切片
# 选择第 0 到第 2 行
rows_0_to_2 = df.iloc[0:3]
print(rows_0_to_2)



输出:
            A  B  C
2024-08-06  0  1  2
2024-08-07  3  4  5
2024-08-08  6  7  8


# 选择第 0 到第 1 列
cols_0_to_1 = df.iloc[:, 0:2]
print(cols_0_to_1)
输出:

             A   B
2024-08-06   0   1
2024-08-07   3   4
2024-08-08   6   7
2024-08-09   9  10
2024-08-10  12  13
2024-08-11  15  16
布尔数组选择
# 选择列 'A' 中值大于 6 的行
rows_A_gt_6 = df.iloc[df['A'] > 6]
print(rows_A_gt_6)

输出:

             A   B   C
2024-08-09   9  10  11
2024-08-10  12  13  14
2024-08-11  15  16  17
混合索引
# 选择第 0 行第 1 列的值
value_0_1 = df.iloc[0, 1]
print(value_0_1)


输出:
1


# 选择第 0 行和第 1、2 列的值
values_0_1_2 = df.iloc[0, [1, 2]]
print(values_0_1_2)


输出:
B    1
C    2
Name: 2024-08-06 00:00:00, dtype: int64

基于标签名选择(loc)

除了使用数字索引进行选择之外,Pandas 还允许我们基于标签名称选择数据。对于这个目的,我们可以使用 df.loc[] 方法。这个方法与 df.iloc[] 非常相似,但使用的是标签而不是位置索引。以下是 df.loc[] 方法可以接受的类型及其用法:

单个标签:例如 2 或 'a',这里的 2 指的是标签而不是索引位置。

列表或数组包含的标签:例如 ['A', 'B', 'C']。

切片对象:例如 'A':'E',这里的切片包括起始和结束标签。

布尔数组。

可返回标签的函数或参数。

让我们基于前面创建的 DataFrame 进行示例说明:

选择单个标签
# 选择标签为 '2024-08-06' 的行
row_20240806 = df.loc['2024-08-06']
print(row_20240806)

输出:

A    0
B    1
C    2
Name: 2024-08-06 00:00:00, dtype: int64


# 选择列 'A'
col_A = df.loc[:, 'A']
print(col_A)


输出:

2024-08-06     0
2024-08-07     3
2024-08-08     6
2024-08-09     9
2024-08-10    12
2024-08-11    15
Freq: D, Name: A, dtype: int64
选择多标签
# 选择标签为 '2024-08-06' 和 '2024-08-07' 的行
rows_20240806_20240807 = df.loc[['2024-08-06', '2024-08-07']]
print(rows_20240806_20240807)


输出:

             A  B  C
2024-08-06   0  1  2
2024-08-07   3  4  5


# 选择列 'A' 和 'B'
cols_AB = df.loc[:, ['A', 'B']]
print(cols_AB)


输出:

             A   B
2024-08-06   0   1
2024-08-07   3   4
2024-08-08   6   7
2024-08-09   9  10
2024-08-10  12  13
2024-08-11  15  16
切片选择
# 选择标签从 '2024-08-06' 到 '2024-08-08' 的行
rows_slice = df.loc['2024-08-06':'2024-08-08']
print(rows_slice)



输出:
             A  B  C
2024-08-06   0  1  2
2024-08-07   3  4  5
2024-08-08   6  7  8


# 选择列从 'A' 到 'B'
cols_slice = df.loc[:, 'A':'B']
print(cols_slice)

输出:

             A   B
2024-08-06   0   1
2024-08-07   3   4
2024-08-08   6   7
2024-08-09   9  10
2024-08-10  12  13
2024-08-11  15  16
布尔数组选择
# 选择列 'A' 中值大于 6 的行
rows_A_gt_6 = df.loc[df['A'] > 6]
print(rows_A_gt_6)

输出:

             A   B   C
2024-08-09   9  10  11
2024-08-10  12  13  14
2024-08-11  15  16  17
混合索引选择
# 选择标签为 '2024-08-06' 行和列 'B' 的值
value_20240806_B = df.loc['2024-08-06', 'B']
print(value_20240806_B)


输出:

1


# 选择标签为 '2024-08-06' 行和列 'B' 和 'C' 的值
values_20240806_BC = df.loc['2024-08-06', ['B', 'C']]
print(values_20240806_BC)


输出:

B    1
C    2
Name: 2024-08-06 00:00:00, dtype: int64

pandas赋值等操作

import pandas as pd
import numpy as np
dates = pd.date_range('20240806', periods=6)

df = pd.DataFrame(np.arange(18).reshape((6, 3)), index=dates, columns=['A', 'B', 'C'])
print(df)



             A   B   C
2024-08-06   0   1   2
2024-08-07   3   4   5
2024-08-08   6   7   8
2024-08-09   9  10  11
2024-08-10  12  13  14
2024-08-11  15  16  17
根据位置替换数据
df.iloc[0, 1] = 100 #将第一行第二列的数值改为100
print(df)


             A    B   C
2024-08-06   0  100   2
2024-08-07   3    4   5
2024-08-08   6    7   8
2024-08-09   9   10  11
2024-08-10  12   13  14
2024-08-11  15   16  17
根据标签替换数据
df.loc["20240811", 'A'] = 100 #将20240811对应的A数值改为100
print(df)

              A    B   C
2024-08-06    0  100   2
2024-08-07    3    4   5
2024-08-08    6    7   8
2024-08-09    9   10  11
2024-08-10   12   13  14
2024-08-11  100   16  17
插入行、列
df['D'] = pd.Series(['1', '2', '3', '4', '5', '6'], index=dates) #通过series数据的形式插入
print(df

             A    B   C  D
2024-08-06    0  100   2  1
2024-08-07    3    4   5  2
2024-08-08    6    7   8  3
2024-08-09    9   10  11  4
2024-08-10   12   13  14  5
2024-08-11  100   16  17  6
df.insert(2, 'F', [1, 2, 3, 4, 5, 6])  # 在第二列的右边插入一个新的D列
print(df)

              A    B  F   C  D
2024-08-06    0  100  1   2  1
2024-08-07    3    4  2   5  2
2024-08-08    6    7  3   8  3
2024-08-09    9   10  4  11  4
2024-08-10   12   13  5  14  5
2024-08-11  100   16  6  17  6
删除

用到drop,在pandas中.drop开头的都与drop删减有关

df2 = df.drop(labels='20240808', axis=0)  # 删除20240808行
print(df2)

             A   B   C
2024-08-06   0   1   2
2024-08-07   3   4   5
2024-08-09   9  10  11
2024-08-10  12  13  14
2024-08-11  15  16  17

DataFrame.drop_duplicates 则通常用于数据去重,即剔除数据集中的重复值。使用方法非常简单,默认情况下,它会根据所有列删除重复的行。也可以使用 subset 指定要删除的特定列上的重复项,要删除重复项并保留最后一次出现,请使用 keep='last'。

DataFrame.dropna 主要的用途是删除缺少值,即数据集中空缺的数据列或行。

pandas对于空数据的处理

对空数值进行赋值

fillna函数
对空值进行赋值,此处赋值为1
print(df.fillna(value=1))

判断数据是否为空值

isnull()
#空值返回True,非空值返回Flase
print(df.isnull())
最后修改:2024 年 08 月 10 日
如果觉得我的文章对你有用,请随意赞赏