Pandas学习入门一

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值