数据处理
数据处理的基本思路
- 同一数据格式
- 时间数据必须转换成时间格式
- 数据操作尽量采用向量操作
- 数据的边界需要一致
- 数据的类型需要一致
数据格式
1. DataFrame
- DataFrame 是一种二维数据结构,类似于一个表格或数据库表格,它由多个列(Series)组成。
- 每列数据可以是不同的数据类型,如整数、浮动小数、字符串等。
- 每行和每列都有标签(行标签是
index
,列标签是columns
)。
2. Series
- Series 是一种一维数据结构,类似于一个列向量。它由一组数据(values)和与之相关的标签(index)组成。
- Series 也可以理解为 DataFrame 中的某一列。
区别:
- Series 仅包含一个一维数据结构,拥有
index
和value
。 - DataFrame 是一个二维数据结构,包含行和列,除了拥有
index
和value
,还拥有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
的关键字参数。
返回值:
- 返回 Series 或 DataFrame,取决于
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)