Python数据库-pandas介绍

在pandas库中,Series和DataFrame是pandas最基本的两种数据结构。
在pandas中,Series是一维容器,表示的是DataFrame的每一行或每一列:

  • 可以把DataFrame看作是由Series对象组成的字典,其中key的列名,Series是字典的值。
  • Series和Python中的列表相似,不同的是Series中的每个数据必须是同类型的。

Series

Series的创建

  1. Series的创建最简单的方法就是传入一个同类型的列表。
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5])
"""
输出结果为:
0    1
1    2
2    3
3    4
4    5
dtype: int64
"""
  1. 创建Series时,可以通过index参数,指定行索引。
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(s)
"""
输出结果为:
a    1
b    2
c    3
d    4
e    5
dtype: int64
"""

Series的常用操作

  1. Series和DataFrame数据类型通常在大模型的训练中被用于读取csv数据文件来做数据分析和预处理。
import pandas as pd
df = pd.read_csv('data/nobel_prizes.csv', index_col='id')    # read_csv()内的参数就是待读取文件在本地的路径。
# 这种方式读取的csv文件结果为DataFrame对象,还需要通过一些操作才能转换为Series对象。
s = df.loc[941]   # loc()的参数为想要读取的列名的index值。
print(s)

输出结果如下:
在这里插入图片描述

  1. 通过index和values属性获取索引和值。
print(s.index)
print(s.value)

输出结果如下:
在这里插入图片描述

  1. Series的keys方法与index属性相同,都是返回索引列。
print(s.keys())

输出结果如下:
在这里插入图片描述

  1. Series的常用属性介绍
属性说明
loc使用索引值取子集
iloc使用索引值位置取子集
dtype/dtypesSeries内容的类型
TSeries矩阵的转置
shape数组的维度
sizeSeries中的元素(不计算NULL值,若需统计NULL,用len())
value/valuseSeries的值
index获取Series的索引
import pandas as pd
import os

print(os.getcwd())

# 2: 创建series对象,读取一个csv文件
df = pd.read_csv('data/nobel_prizes.csv', index_col='id')
# 从上述的df中,获取到第一行数据,即series对象,进行属性操作演示
first_row = df.iloc[0]
print(first_row)
print(type(first_row))
# 3:演示series的常用属性
print(first_row.dtype) # 获取series的元素类型, object(字符串)
print(first_row.dtypes) # 获取series的元素类型, object(字符串)
print(first_row['year'], first_row['year'].dtype) # 2017 int64
print(first_row.shape) # 维度:(7,)
print(first_row.size) # 元素个数:7
print(first_row.index) # Index(['year', 'category', 'overallMotivation', 'firstname', 'surname', 'motivation', 'share'], dtype='object')
print(first_row.values) # [2017 'physics' nan 'Rainer' 'Weiss' '"for decisive contributions to the LIGO detector and the observation of gravitational waves"'2]
print(first_row.keys()) # Index(['year', 'category', 'overallMotivation', 'firstname', 'surname','motivation', 'share'], dtype='object')

  1. Series的常用方法介绍
head()和tail()获取前n行数据和后n行数据
count()获取series的非空元素个数
sum()获取series的元素和
mean()获取series的元素平均值
mode()获取series的元素众数
min()获取series的元素最小值
max()获取series的元素最大值
import pandas as pd

# 2: 创建series对象
s1 = pd.Series([1, 2, 3, 4, 2, 3], index=['a', 'b', 'c', 'd', 'e', 'f'])
print(s1.max)
print(s1.max())     
print(s1.size)
print(s1.min())
print(s1.to_list()) # [1, 2, 3, 4, 2, 3]
print(s1.to_list) # [1, 2, 3, 4, 2, 3]
print("---------------------------")
# 3:演示series的常用方法
print(len(s1)) # 6
print(s1.size) # 6
print(s1.head()) # 默认打印前五条
print(s1.head(3)) # 打印前3条
print(s1.tail())  # 默认打印后5条
print(s1.tail(3)) # 打印后3条
print(s1.index) # Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
print(s1.keys())  # Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
print(s1.values) # [1 2 3 4 2 3]
print(s1.to_list()) # [1, 2, 3, 4, 2, 3]
print(type(s1.to_list())) # <class 'list'>

print("---------------------------")
print(s1.describe()) # 统计信息
print(s1.max())   # 获取series的元素最大值
print(s1.min)   # 获取series的元素最小值
print(s1.mean)  # 获取series的元素平均值
print(s1.median) # 获取series的元素中位数
print(s1.mode) # 获取series的元素众数
print(s1.std) # 获取series的元素标准差

print("---------------------------")
print(s1.drop_duplicates())# 删除重复的元素
print(s1.sort_values())# 排序,根据值排序,默认是升序
print(s1.sort_values())# 排序,根据值排序,默认是升序
print(s1.sort_values(ascending=False))# 排序,根据值排序,降序
print(s1.sort_index())  # 排序,根据索引排序,默认是升序
print(s1.sort_index(ascending=False)) # 排序,根据索引排序,降序
print(s1.unique()) # 去重
print(s1.value_counts()) # 统计每个元素出现的次数
  1. Series的布尔索引:需手动创建一组由列表组成的布尔值(布尔值的数量需要与Series对象元素数量一致,否则会报错),通过布尔值索引,获取True的值。
import pandas as pd
df = pd.read_csv('data/scientists.csv')
s = df['Age']
bool_list = [True, False, False, True, False, False, True, True]
print(s)
print(s[bool_list])

结果如图,上方为s列对象,下方为布尔索引结果。
在这里插入图片描述

  • 布尔索引值的应用案例:筛选年龄大于平均年龄的科学家。
import pandas as pd
df = pd.read_csv('data/scientists.csv')
s = df['Age']
print(s[s > s.mean()])

可以看到,结果轻松筛选出了大于平均年龄的科学家。
在这里插入图片描述

  1. Series的运算

    1. Series在与数值型变量计算时,变量会与Series中的每个元素逐一进行计算。
    import pandas as pd
    df = pd.read_csv('data/scientists.csv')
    s = df['Age']
    print(s + 1)
    """
    输出结果:
    s的输出:               s + 1的输出:
    0    37                0      38
    1    61                1      62
    2    90                2      91
    3    66                3      67
    4    56                4      57
    5    45                5      46
    6    41                6      42
    7    77                7      78
    """
    
    1. 两个Series之间计算,如果Series元素个数相同,则将两个Series对应元素进行计算。
    import pandas as pd
    df = pd.read_csv('data/scientists.csv')
    s = df['Age']
    print(s + s)
    """
    输出结果:
    s的输出:               s + 1的输出:
    0    37                0      74
    1    61                1      122
    2    90                2      180
    3    66                3      132
    4    56                4      112
    5    45                5      90
    6    41                6      82
    7    77                7      154
    """
    
    1. 元素个数不同的Series之间会根据索引值进行计算,索引值不同的元素最终计算结果被填充为NaN。
    import pandas as pd
    df = pd.read_csv('data/scientists.csv')
    s = df['Age']
    s1 = s.sort_values(ascending=False)
    print(s)
    print(s1)
    print(s + s1)
    

    结果如下,s与s1的输出结果如图一所示,然而二者相加后的结果依旧是输出结果如图二所示。
    在这里插入图片描述

    在这里插入图片描述

DataFrame

DataFrame的创建

  1. 通过字典直接创建DataFrame对象
import pandas as pd
dict_data = {
    'name':['张三','李四','王五'],
    'age':[18,19,20],
    'sex':['男','女','男']
}
df1 = pd.DataFrame(dict_data)
print(df1)

输出结果如图所示:

在这里插入图片描述

  1. 创建DataFrame的时指定列的顺序和行索引
import pandas as pd
dict_data = {
    'name':['张三','李四','王五'],
    'age':[18,19,20],
    'sex':['男','女','男']
}
df2 = pd.DataFrame(dict_data, index=['a', 'b', 'c'])
print(df2)

输出结果如图所示:

在这里插入图片描述

  1. 通过pandas中的read_csv方法读取CSV文件
import pandas as pd
df = pd.read_csv("data/scientists.csv")
print(df)

输出结果如图所示:

在这里插入图片描述

DataFrame的常用操作

  1. DataFrame的属性、方法、布尔索引和运算几乎与Series对象相同,此处就不做过多介绍

  2. 更改DataFrame索引

    • 通过set_index()方法设置行索引名字。加载数据文件时,如果不指定行索引,Pandas会自动加上从0开始的索引
    import pandas as pd
    df = pd.read_csv("../data/movie.csv")
    df.set_index('movie_title', inplace=True)
    print(df)
    

    输出结果如下:

    在这里插入图片描述

    • 加载数据的时候,可以通过通过index_col参数,指定使用某一列数据作为行索引。
    import pandas as pd
    df = pd.read_csv("../data/movie.csv", index_col='movie_title')
    print(df)
    

    输出结果如图所示:

    在这里插入图片描述

    • 通过reset_index()方法可以重置索引
    import pandas as pd
    df = pd.read_csv("../data/movie.csv", index_col='movie_title')
    df.reset_index(inplace=True)
    print(df)
    

    输出结果如下:
    在这里插入图片描述

  3. 修改DataFrame列名(修改行名与列名相同)。

    • 通过rename()方法对原有的行索引名和列名进行修改。
    import pandas as pd
    df = pd.read_csv("data/movie.csv", index_col='movie_title')
    print(df.index[:5])   # 输出前5行的索引值
    index_list = {'Avatar' : '阿凡达', "Pirates of the Caribbean: At World's End" : '加勒比海盗'}
    df.rename(index = index_list, inplace=True)
    print(df.index[:5])
    

    输出结果如下:

    在这里插入图片描述

    • 将index和columns属性提取出来重新赋值后再赋值给DataFrame对象。
    import pandas as pd
    df = pd.read_csv("data/movie.csv", index_col='movie_title')
    index = df.index.to_list()  # to_list()方法将索引值以列表形式输出
    print(index[:5])
    index[0] = '阿凡达'
    index[1] = '加勒比海盗'
    df.index = index
    print(index[:5])
    

    输出结果如下:

    在这里插入图片描述

  4. 添加/删除/插入列

    • 通过dataframe[列名]=列值添加新列。
    import pandas as pd
    df = pd.read_csv("data/movie.csv", index_col='movie_title')
    df['has_seen'] = 0  # 添加一个是否看过电影列,默认值为0
    print(df.head())
    

    输出结果如下:
    在这里插入图片描述

    • 调用drop方法删除列。
    import pandas as pd
    df = pd.read_csv("data/movie.csv", index_col='movie_title')
    df['has_seen'] = 0  # 添加一个是否看过电影列,默认值为0
    df.drop('has_seen', axis=1, inplace=True)   # axis=1表示删除列,axis=0表示删除行
    

    输出结果如下:

    在这里插入图片描述

    • 使用insert方法插入列。
    import pandas as pd
    df = pd.read_csv("data/movie.csv", index_col='movie_title')
    df.insert(0, 'profit', df['gross'] - df['budget'])
    print(df.head())
    

    输出结果如下:
    在这里插入图片描述

数据的导入导出

pandas库的功能十分强大,其主要表现在pandas能读取各种格式的文件:

  1. pickle文件:Python中的一个标准模块,用于实现数据的序列化和反序列化。它可以将Python对象转换为字节流(序列化),也可以将字节流转换回 Python 对象(反序列化)。

    • 特点:
    • Python 专用:Pickle 是 Python 特有的序列化格式。
    • 支持多种对象:可以序列化大多数 Python 对象,包括自定义类实例。
    • 二进制格式:Pickle 文件是二进制格式,不是人类可读的。
    • 基本用法如图:在这里插入图片描述
  2. CSV(Comma-Separated Values,逗号分隔值)是一种简单的文本文件格式,用于存储表格数据(如电子表格或数据库数据)。

    • 特点:
    • 纯文本格式:人类可读,可以用文本编辑器直接查看和编辑。
    • 通用性强:几乎所有数据处理工具和编程语言都支持。
    • 结构简单:每行代表一条记录,字段间用分隔符(通常是逗号)隔开。
    • PS:除了逗号,还可以使用其他类型的分隔符,比如TSV文件,使用制表符作为分隔符。
    • 基本用法如图:在这里插入图片描述
  3. Excel文件是由Microsoft Excel创建和使用的电子表格文件,是最常用的办公文档格式之一,用于存储、组织、计算和分析数据。

    • 特点:
    • 结构化数据存储:以工作簿(Workbook)和工作表(Worksheet)的形式组织数据。
    • 多功能性:支持公式计算、图表、数据透视表等高级功能。
    • 二进制和XML格式:传统为.xls(二进制),新版为.xlsx(基于XML的开放格式)
    • PS:Series这种数据结构不支持to_excel方法,想保存成Excel文件,需要把Series转换成DataFrame。
    • 基本用法如图:在这里插入图片描述
  4. 其它还有诸多格式,其导入导出方式基本与上述三种文件一致,就不做过多赘述,详细可以查看下表:

    导出方法说明
    to_clipboard()把数据保存在系统剪切版中,方便粘贴
    to_dict把数据转换成Python字典
    to_hdf把数据保存为HDF格式
    to_html把数据转换成HTML格式
    to_json把数据转换成JSON字符串
    to_sql把数据保存到SQL数据库

成DataFrame。

  • 基本用法如图:[外链图片转存中…(img-Jv76ISVP-1755823433423)]
  1. 其它还有诸多格式,其导入导出方式基本与上述三种文件一致,就不做过多赘述,详细可以查看下表:

    导出方法说明
    to_clipboard()把数据保存在系统剪切版中,方便粘贴
    to_dict把数据转换成Python字典
    to_hdf把数据保存为HDF格式
    to_html把数据转换成HTML格式
    to_json把数据转换成JSON字符串
    to_sql把数据保存到SQL数据库
<think>嗯,用户想了解如何在Python中结合使用数据库Pandas进行数据处理。我需要根据提供的引用资料整理出一个清晰的步骤指南。首先,用户可能需要安装必要的库,比如pandas数据库驱动,比如pymysql或者sqlite3。然后连接到数据库,读取数据到DataFrame,处理后再写回数据库。需要分步骤说明,并给出代码示例。还要注意引用对应的参考文献,比如引用2和引用4提到了pymysql的连接方式,引用3提到了sqlite3。可能还需要提到不同的数据库可能需要不同的驱动,比如MySQL用pymysql,PostgreSQL用psycopg2。另外,用户可能关心如何处理数据,比如清洗、转换后再存储,这部分可以举一些例子,比如过滤、聚合等操作。还要注意提到to_sql的参数,比如if_exists的处理方式,避免覆盖数据。可能还需要提醒用户关闭数据库连接,或者使用上下文管理器自动管理连接。此外,错误处理也是一个点,比如捕获连接异常。最后,生成相关问题时,可以考虑性能优化、大数据处理、事务处理等方向。需要确保步骤清晰,代码正确,并且覆盖用户可能的常见需求。</think>在Python中结合使用数据库Pandas进行数据操作主要分为三个步骤:数据库连接、数据读写和数据处理。以下是具体实现方法: ### 一、数据库连接配置 1. **安装依赖库** ```bash pip install pandas pymysql # MySQL数据库 # 或 pip install pandas sqlite3 # SQLite数据库 ``` 2. **建立数据库连接**(以MySQL为例) ```python import pandas as pd import pymysql conn = pymysql.connect( host='localhost', user='root', password='password', database='db_name', charset='utf8mb4' ) ``` [^2][^4] ### 二、数据读写操作 1. **读取数据到DataFrame** ```python # 通过SQL查询获取数据 query = "SELECT * FROM sales WHERE amount > 1000" df = pd.read_sql(query, conn) # 直接读取整张表 df_table = pd.read_sql_table('employees', conn) ``` 2. **写入数据到数据库** ```python # 将处理后的数据写入新表 df_processed.to_sql( 'new_sales_data', con=conn, if_exists='replace', # 可选replace/append/fail index=False ) ``` [^3] ### 三、数据处理流程示例 ```python # 1. 读取原始数据 raw_df = pd.read_sql("SELECT * FROM raw_logs", conn) # 2. 数据清洗 clean_df = raw_df.dropna().query("status == 'success'") # 3. 数据转换 clean_df['timestamp'] = pd.to_datetime(clean_df['timestamp']) daily_stats = clean_df.groupby(pd.Grouper(key='timestamp', freq='D')).agg({ 'request_count': 'sum', 'response_time': 'mean' }) # 4. 写入结果 daily_stats.to_sql('daily_metrics', conn, if_exists='append') ``` ### 四、连接管理最佳实践 建议使用上下文管理器自动处理连接: ```python with pymysql.connect(...) as conn: df = pd.read_sql("SELECT * FROM table", conn) # 自动关闭连接 ``` ### 注意事项 1. 大数据集建议使用`chunksize`参数分块读取 2. 写入时设置`index=False`避免存储冗余索引 3. 使用`try-except`块处理数据库操作异常 4. 不同数据库需要对应驱动(如PostgreSQL使用`psycopg2`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值