Pandas学习入门一

1.什么是Pandas?

Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。

  • 一个强大的分析和操作大型结构化数据集所需的工具集
  • 基础是NumPy,提供了高性能矩阵的运算
  • 提供了大量能够快速便捷地处理数据的函数和方法
  • 应用于数据挖掘,数据分析
  • 提供数据清洗功能

2.DataFrame

DataFrame 是一个二维标签化数据结构,你可以将其想象为一个 Excel 电子表格或者 SQL 表,或者是一个字典类型的集合。

python 复制代码
# 创建一个 DataFrame 对象,支持自定义数据、索引、列名和数据类型。
pd.DataFrame(data, index, columns, dtype, copy)
# index 行索引
# columns 列索引

2.1 行索引

python 复制代码
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)
bash 复制代码
# #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

python 复制代码
# 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转置

python 复制代码
# 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 行索引

python 复制代码
# index属性查看行索引
frame.index
# 指定行索引
frame = pd.DataFrame(data,index=['a','b','c','d'])
print(frame)

3.3 列索引

bash 复制代码
# columns属性查看列索引
frame.columns
# 指定列索引
frame = pd.DataFrame(data,index=['a','b','c','d'],columns=['B','A','C','D'])
frame

3.4 Series构成的字典构造dataframe

bash 复制代码
pd1 = pd.DataFrame({'a':pd.Series(np.arange(3)),
            'b':pd.Series(np.arange(3,5))})

print(pd1)

3.4字典嵌套

python 复制代码
#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

python 复制代码
# 构造二维数据对象
arr1 = np.arange(12).reshape(4,3)
print(arr1)
frame1 = pd.Dataframe(arr1)
print(frame1)

字典构成的列表构造dataframe

python 复制代码
#2 字典构成的列表构造dataframe
l1 = [{'apple':3.6,'banana':5.6},{'apple':3,'banana':5},{'apple':3.2}]
pd3 = pd.DataFrame(l1)
print(pd3)

Series构成的列表构造dataframe

python 复制代码
#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创建

python 复制代码
import numpy as np
import pandas as pd
# 1.通过list创建
s1 = pd.Series([1,2,3,4,5])
print(s1)

2.通过数组创建

python 复制代码
# 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.通过字典创建

bash 复制代码
# 3 通过字典创建
dict = {'name':'姚明','age':18,'class':'二班'}
s4 = pd.Series(dict,index=['age','class','name','sex'])
print(s4)

3.Series基本使用

3.1检查缺失值

bash 复制代码
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数据

bash 复制代码
# 设置显示的最大行数为None(无限制)
pd.set_option('display.max_rows', None)

# 设置显示的最大列数为None(无限制)
pd.set_option('display.max_columns', None)
# 设置宽度,以便更宽的屏幕可以展示更多内容
pd.set_option('display.width', 1000)

也可以通过

bash 复制代码
# 查看最后五行数据
df.tail(5)
# 查看前五行数据
df.head(5)
python 复制代码
"""
@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

bash 复制代码
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默认会创建新表,如果追加可以使用

bash 复制代码
frame1.to_sql('ware_price_aaa',engine,index=False, if_exists="append")

6.数据清洗

1.处理缺失数据

  • pd.fillna()

  • pd.dropna()

2.数据转换

2.1 处理重复数据

duplicated()返回布尔型Series表示每行是否为重复行

示例代码:

bash 复制代码
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传入的函数对每行或每列进行转换

示例代码:

python 复制代码
ser_obj = pd.Series(np.random.randint(0,10,10))
print(ser_obj)

print(ser_obj.map(lambda x : x ** 2))

2.3 替换值

replace根据值的内容进行替换
python 复制代码
# 单个值替换单个值
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字符串函数:

python 复制代码
"""
@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
python 复制代码
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)

结果如下

bash 复制代码
   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

示例代码:

python 复制代码
# 默认操作内层索引
print(stacked.unstack())

# 通过level指定操作索引的级别
print(stacked.unstack(level=0))

运行结果:

python 复制代码
# 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

python 复制代码
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'))

聚合

python 复制代码
#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
相关推荐
知识分享小能手2 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
茯苓gao5 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾5 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT6 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa6 小时前
HTML和CSS学习
前端·css·学习·html
看海天一色听风起雨落7 小时前
Python学习之装饰器
开发语言·python·学习
speop8 小时前
llm的一点学习笔记
笔记·学习
非凡ghost8 小时前
FxSound:提升音频体验,让音乐更动听
前端·学习·音视频·生活·软件需求
ue星空8 小时前
月2期学习笔记
学习·游戏·ue5
萧邀人9 小时前
第二课、熟悉Cocos Creator 编辑器界面
学习