Skip to main content

数据处理

数据处理的基本思路

  • 同一数据格式
  • 时间数据必须转换成时间格式
  • 数据操作尽量采用向量操作
    • 数据的边界需要一致
    • 数据的类型需要一致

数据格式

1. DataFrame

  • DataFrame 是一种二维数据结构,类似于一个表格或数据库表格,它由多个列(Series)组成。
  • 每列数据可以是不同的数据类型,如整数、浮动小数、字符串等。
  • 每行和每列都有标签(行标签是 index,列标签是 columns)。

2. Series

  • Series 是一种一维数据结构,类似于一个列向量。它由一组数据(values)和与之相关的标签(index)组成。
  • Series 也可以理解为 DataFrame 中的某一列。

区别:

  • Series 仅包含一个一维数据结构,拥有 indexvalue
  • DataFrame 是一个二维数据结构,包含行和列,除了拥有 indexvalue,还拥有 columns,即列标签。

联系:

  • DataFrame 是由多个 Series 组成的。在 DataFrame 中,每一列本质上都是一个 Series。无论是按行还是按列,单独拆分出来的都是一个 Series。

数据遍历

行遍历

itertuples

语法:DatrFrame.itertuples(index=False) -> nametuple

# 假设数据的列名为: ["A", "B"]
for row in data.itertuple():
# 数据读取
row.index => row[0] # 如果index=True,第一个数据就是索引
row.A => row[1] # 如果inde=False, 这里可以使用索引0

apply

apply 方法与 JavaScript 中的 apply 函数非常相似,用于将一个函数应用到 DataFrame 的每一行或每一列。

语法:

DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwargs)

参数:

  • func:函数或 lambda 表达式,应用于每行或每列。

  • axis:决定函数应用的轴,默认为 0

    • 0'index':表示函数处理每一列(按列操作)。
    • 1'columns':表示函数处理每一行(按行操作)。
  • raw:布尔类型,默认为 False

    • False:将每一行或列作为 Series 传入函数中。
    • True:将每一行或列作为 ndarray 数据类型传入函数中。
  • result_type:指定返回结果的类型,仅在 axis=1 时生效。可选值为:

    • 'expand':如果结果是列表类型,将转化为多列。
    • 'reduce':如果可能,返回 Series,而不是展开的列表类型结果。
    • 'broadcast':结果将被广播到 DataFrame 的原始形状,保留原始索引和列。
    • None(默认):返回原始类型。
  • args:传递给 func 的位置参数。

  • kwargs:传递给 func 的关键字参数。

返回值:

  • 返回 SeriesDataFrame,取决于 func 应用的结果和 axis 的设置。

示例:

1. 行遍历

通过设置 axis=1,可以让 apply 函数按行遍历 DataFrame。

# 定义一个函数,处理每一行
def print_raw(row):
# row 对应每一行的数据
for data in row:
print(data)

# 应用到 DataFrame
DataFrame.apply(print_raw, axis=1)
2. 列遍历

通过设置 axis=0,可以让 apply 函数按列遍历 DataFrame。

# 定义一个函数,处理每一列
def print_raw(col):
# col 对应每一列的数据
for data in col:
print(data)

# 应用到 DataFrame
DataFrame.apply(print_raw, axis=0)
  • for + zip

列遍历

数据合并

常用的api

  • concat
  • append
  • merge
  • join
  • combine

concat

pd.concat(
objs: 'Iterable[NDFrame] | Mapping[Hashable, NDFrame]',
axis=0,
join='outer',
ignore_index: 'bool' = False,
keys=None,
levels=None,
names=None,
verify_integrity: 'bool' = False,
sort: 'bool' = False,
copy: 'bool' = True,
) -> 'FrameOrSeriesUnion'

参数作用:

  • objs: 用于连接的数据,可以是DataFrame或Series组成的列表
  • axis=0 : 连接的方式,默认为0也就是纵向连接,可选 1横向连接
  • join='outer':合并方式,默认为 inner也就是交集,可选 outer 为并集
  • ignore_index: 是否保留原有的索引
  • keys=None:连接关系,使用传递的值作为一级索引
  • levels=None:用于构造多级索引
  • names=None:索引的名称
  • verify_integrity: 检测索引是否重复,如果为True则有重复索引会报错
  • sort: 并集合并方式下,对columns排序
  • copy: 是否深度拷贝

示例:

  • 纵向链接
df = pd.DataFrame(
{
"A": ["one", "one", "two", "three"] * 3,
"B": ["A", "B", "C"] * 4,
"C": ["foo", "foo", "foo", "bar", "bar", "bar"] * 2,
"D": np.random.randn(12),
"E": np.random.randn(12),
}
)

new = pd.concat([df[0:1], df[3:4]], axis=1)

new.to_excel("./test1.xlsx", engine="openpyxl", sheet_name="1", index=False)

append

参阅资料