1.什么是Pandas?
Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。
- 一个强大的分析和操作大型结构化数据集所需的工具集
- 基础是NumPy,提供了高性能矩阵的运算
- 提供了大量能够快速便捷地处理数据的函数和方法
- 应用于数据挖掘,数据分析
- 提供数据清洗功能
2.DataFrame
DataFrame 是一个二维标签化数据结构,你可以将其想象为一个 Excel 电子表格或者 SQL 表,或者是一个字典类型的集合。
# 创建一个 DataFrame 对象,支持自定义数据、索引、列名和数据类型。
pd.DataFrame(data, index, columns, dtype, copy)
# index 行索引
# columns 列索引
2.1 行索引
import numpy as np
import pandas as pd
# 1.数组、列表或元组构成的字典构造dataframe
# 构造一个字典
data = {
'A': [1, 2, 3, 4],
'B': (5, 6, 7, 8),
'C': np.arange(9, 13)
}
# 构造dataframe
frame = pd.DataFrame(data)
print(frame)
print(type(frame))
# index 查看行属性
print("行属性:---", frame.index)
# #3.字典构成的字典构造dataframe
# 字典嵌套
data1 = {
"a": {"apple": 3.6, "banana": 5.6},
"b": {"apple": 3, "banana": 5},
"c": {"apple": 3.2}
}
print(data1)
pd2 = pd.DataFrame(data1)
print(pd2)
series 构成字典构成 dataframe
# series 构成字典构成 dataframe
pd1 = pd.DataFrame({
"a": pd.Series(np.arange(3)),
"b": pd.Series(np.arange(3, 5))
})
print("---", pd1)
3.DataFrame的基本使用
3.1 .T转置
# DataFrame
pd5 = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','c','b'],columns=['A','B','C'])
print(pd5)
# 和numpy一样进行转置 行和列
pd5.T
3.2 行索引
# index属性查看行索引
frame.index
# 指定行索引
frame = pd.DataFrame(data,index=['a','b','c','d'])
print(frame)
3.3 列索引
# columns属性查看列索引
frame.columns
# 指定列索引
frame = pd.DataFrame(data,index=['a','b','c','d'],columns=['B','A','C','D'])
frame
3.4 Series构成的字典构造dataframe
pd1 = pd.DataFrame({'a':pd.Series(np.arange(3)),
'b':pd.Series(np.arange(3,5))})
print(pd1)
3.4字典嵌套
#3.字典构成的字典构造dataframe
#字典嵌套
data1 = {
'a':{'apple':3.6,'banana':5.6},
'b':{'apple':3,'banana':5},
'c':{'apple':3.2}
}
pd2 = pd.DataFrame(data1)
print(pd2)
3.5 列表类
2D ndarray 构造dataframe
# 构造二维数据对象
arr1 = np.arange(12).reshape(4,3)
print(arr1)
frame1 = pd.Dataframe(arr1)
print(frame1)
字典构成的列表构造dataframe
#2 字典构成的列表构造dataframe
l1 = [{'apple':3.6,'banana':5.6},{'apple':3,'banana':5},{'apple':3.2}]
pd3 = pd.DataFrame(l1)
print(pd3)
Series构成的列表构造dataframe
#3 Series构成的列表构造dataframe
l2 = [pd.Series(np.random.rand(3)),pd.Series(np.random.rand(2))]
pd4 = pd.DataFrame(l2)
print(pd4)
4.Series
1.Series介绍
2.创建方式
1.通过list创建
import numpy as np
import pandas as pd
# 1.通过list创建
s1 = pd.Series([1,2,3,4,5])
print(s1)
2.通过数组创建
# 2.通过数组创建
import numpy as np
import pandas as pd
arr1 = np.arange(1,6)
s2 = pd.Series(arr1)
print(s2)
# 索引 索引默认0开始的整型序列
# 索引长度和数据长度一致
s3 = pd.Series(arr1,index=['a','b','c','d','e'])
print(s3)
# 查看值
print(s3.values)
print(s3.index) # 索引对象
3.通过字典创建
# 3 通过字典创建
dict = {'name':'姚明','age':18,'class':'二班'}
s4 = pd.Series(dict,index=['age','class','name','sex'])
print(s4)
3.Series基本使用
3.1检查缺失值
s4.isnull() # 判断是否为空
s4.notnull() # 判断是否为不为空
# 3.2 通过索引获取数据
print(s4.index)
print(s4.values)
# 下标 负号索引支持
s4[0]
# 标签名
s4['age']
# 选取多个
s4[[1,3]]
s4[['name','age']]
# 切片
s4[1:4]
s5 = s4['name':'age':-1] # 标签切片 包含末端数据 顺序
s3[s3>3]
# 索引与数据对应关系不会被运算结果影响
s3 + 2
# index
# values
# name属性
s3.name = 'temp' # 对象名
s3.index.name = 'year' # 对象索引名s3
s3
5.pandas链接数据库
默认显示行数会压缩
1.读取mysql数据
# 设置显示的最大行数为None(无限制)
pd.set_option('display.max_rows', None)
# 设置显示的最大列数为None(无限制)
pd.set_option('display.max_columns', None)
# 设置宽度,以便更宽的屏幕可以展示更多内容
pd.set_option('display.width', 1000)
也可以通过
# 查看最后五行数据
df.tail(5)
# 查看前五行数据
df.head(5)
"""
@Time : 2025/5/22 16:13
@Author : white.tie
@File : 03mysql.py
@Desc : 读取mysql中的数据
"""
import pandas as pd
from sqlalchemy import create_engine
import pandas as pd
# 设置显示的最大行数为None(无限制)
pd.set_option('display.max_rows', None)
# 设置显示的最大列数为None(无限制)
pd.set_option('display.max_columns', None)
# 设置宽度,以便更宽的屏幕可以展示更多内容
pd.set_option('display.width', 1000)
# 密码中的@需要转义为%40
engine = create_engine('mysql+pymysql://spider:zzwl%402024@192.168.0.103:3307/spider')
sql = """
select * from ware_price_202502 limit 100
"""
df = pd.read_sql(sql,engine)
print(df)
df.to_excel('output.xlsx', index=False)
2.将数据写入Mysql
frame1.to_sql('ware_price_aaa',engine,index=False)
sql = """
select * from ware_price_202502 limit 100
"""
df = pd.read_sql(sql,engine)
# print(df)
# df.to_excel('output.xlsx', index=False)
frame1 = df.head(3)
result = frame1["raw_defect_url"]
# print(result[0])
frame1["raw_defect_url"][0] = result[0].replace("ahs-creative.oss-cn-shanghai","ali.oss-cn-hangzhou")
print(frame1)
frame1.to_sql('ware_price_aaa',engine,index=False)
print("ok")
其中to_sql默认会创建新表,如果追加可以使用
frame1.to_sql('ware_price_aaa',engine,index=False, if_exists="append")
6.数据清洗
1.处理缺失数据
-
pd.fillna()
-
pd.dropna()
2.数据转换
2.1 处理重复数据
duplicated()返回布尔型Series表示每行是否为重复行
示例代码:
import numpy as np
import pandas as pd
df_obj = pd.DataFrame(
{
'data1': ['a'] * 4 + ['b'] * 4,
'data2': np.random.randint(0, 4, 8)
}
)
print(df_obj)
print("----")
# duplicated()返回布尔型Series表示每行是否为重复行
print(df_obj.duplicated())
2.2 利用函数或映射进行数据转换
根据map传入的函数对每行或每列进行转换
示例代码:
ser_obj = pd.Series(np.random.randint(0,10,10))
print(ser_obj)
print(ser_obj.map(lambda x : x ** 2))
2.3 替换值
replace根据值的内容进行替换
# 单个值替换单个值
print(ser_obj.replace(1, -100))
# 多个值替换一个值
print(ser_obj.replace([6, 8], -100))
# 多个值替换多个值
print(ser_obj.replace([4, 7], [-100, -200]))
3. 字符串操作
3.1 字符串方法
3.2 正则表达式方法
3.3 pandas字符串函数:
"""
@Time : 2025/5/26 13:45
@Author : white.tie
@File : 06str_alter.py
@Desc :
"""
import pandas as pd
if __name__ == '__main__':
str_ = pd.Series(["AAA ","Aa B","a Aa"," aaa"])
print(str_.str.lower())
print(str_.str.len()) # 计算字符串长度
str_strip = str_.str.rstrip() # 去除右边空格
print(str_strip)
print(str_strip.str.len())
str_lstrip = str_.str.lstrip() # 去除左边空格
print(str_lstrip)
print(str_lstrip.str.len())
4.重塑
1. stack
- 将列索引旋转为行索引,完成层级索引
- DataFrame->Series
import numpy as np
import pandas as pd
df_obj = pd.DataFrame(np.random.randint(0,10, (5,2)), columns=['data1', 'data2'])
print(df_obj)
stacked = df_obj.stack()
print(stacked)
结果如下
data1 data2
0 4 6
1 8 2
2 1 3
3 1 6
4 6 5
0 data1 4
data2 6
1 data1 8
data2 2
2 data1 1
data2 3
3 data1 1
data2 6
4 data1 6
data2 5
dtype: int32
2.unstack
- 将层级索引展开
- Series->DataFrame
- 默认操作内层索引,即level=-1
示例代码:
# 默认操作内层索引
print(stacked.unstack())
# 通过level指定操作索引的级别
print(stacked.unstack(level=0))
运行结果:
# print(stacked.unstack())
data1 data2
0 7 9
1 7 8
2 8 9
3 4 1
4 1 2
# print(stacked.unstack(level=0))
0 1 2 3 4
data1 7 7 8 4 1
data2 9 8 9 1 2
7.数据聚合与分组
-
什么是分组聚合?如图:
-
groupby:(by=None,as_index=True)
by:根据什么进行分组,用于确定groupby的组
as_index:对于聚合输出,返回以组便签为索引的对象,仅对DataFrame
import pandas as pd
df1 = pd.DataFrame({'fruit':['apple','banana','orange','apple','banana'],
'color':['red','yellow','yellow','cyan','cyan'],
'price':[8.5,6.8,5.6,7.8,6.4]})
type(df1.groupby('fruit'))
聚合
#Groupby对象具有上表中的聚合方法
#根据fruit来求price的平均值
df1['price'].groupby(df1['fruit']).mean()
fruit
apple 8.15
banana 6.60
orange 5.60
Name: price, dtype: float64
#或者
df1.groupby('fruit')['price'].mean()
#as_index=False
df1.groupby('fruit',as_index=False)['price'].mean()
fruit price
0 apple 8.15
1 banana 6.60
2 orange 5.60
"""
如果我现在有个需求,计算每种水果的差值,
1.上表中的聚合函数不能满足于我们的需求,我们需要使用自定义的聚合函数
2.在分组对象中,使用我们自定义的聚合函数
"""
#定义一个计算差值的函数
def diff_value(arr):
return arr.max() - arr.min()
#使用自定义聚合函数,我们需要将函数传递给agg或aggregate方法,我们使用自定义聚合函数时,会比我们表中的聚合函数慢的多,因为要进行函数调用,数据重新排列
df1.groupby('fruit')['price'].agg(diff_value)
fruit
apple 0.7
banana 0.4
orange 0.0
Name: price, dtype: float64