前言
总结才是知识,作者习惯不好,不会总结,导致函数一旦不使用就会忘记怎么使用,特此写了本文,用于给自己一个复习的资料.
提示:如果你是小白,每个代码请自己敲打。
一 pandas的介绍
Pandas is a python library used for working with data sets
It has functions for analyzing ,cleaning,exploring and mainpulating data
The name "pandas" has a reference to both "Panel Data" and "Python Data Analysis" and was created by Wes Mckinney in 2008
二 pandas Series
Series 是一个包含任何数据类型的数据的一维数组,就像表中的一列。(注意:首字母大写)
2.1 语法:
import pandas as pdpd.Series(data,index,dtype)
# 参数介绍
# data :一维数组(ndarray 类型)
# index:数据索引标签(可以是字符串类型、数字或者混合),默认是从0开始,可以重复
# dtype:数据类型,会根据数组内值类型返回结果
- dtype :
数据类型 描述 内存占用 精度范围 使用场景
'i4' 32 位整数 4 字节 -2^31 至 2^31-1 小范围整数,如索引或计数器
'i8' 64 位整数 8 字节 -2^63 至 2^63-1 大范围整数,如时间戳或 ID
'f4' 32 位浮点数 4 字节 约 7 位有效数字 低精度计算,如图像处理
'f8' 64 位浮点数 8 字节 约 15 位有效数字 高精度计算,如科学分析
2.2 如何创建Series
import pandas as pd
import numpy as np
# 创建空的Series
s_1 = pd.Series() # 所有的值都是默认值 dtype:object# 使用numpy中的ndarray创建 Series
arry = np.random.randn(5)
s_2 = pd.Series(data=arry)# 使用列表创建
l_1 = [1,2,3]
s_3=pd.Series(data=l_1)# 使用字典创建
dict1 = {"小张":1,"小明":2,"小红":3}
s_4=pd.Series(data=dict1)# 使用标量创建
s_5= pd.Series(data=10,index=range(0,10))
2.3 针对Series的操作
- 修改index
s_4.index=[0,1,2]print(s_4)
- #删除特定的值
Series.drop(labels=None, *, axis=0, index=None,level=None, inplace=False, errors='raise')
## 参数
# labels: 单个标签或标签列表。指定要从 Series 中删除的索引标签。
# axis: 只能为 0 或 index,因为 Series 是一维数据结构,仅支持沿索引方向操作。
# index: 替代参数,用于直接指定要删除的索引。与 labels 功能相同,但更直观。
# level: 如果索引是 MultiIndex,则可以指定删除哪一层级的索引。
# inplace: 布尔值。如果设置为 True,则直接在原 Series 上进行修改;否则返回一个新的 Series。
# errors: 字符串。如果设置为 'ignore',当指定的标签不存在时不会抛出错误,而是忽略该标签;默认值为 'raise',会抛出错误。print(s_4.drop(labels=0))
print(s_4.drop(index=[0,1]))
print(s_4) # 因为inplace=False,因此不会改变Series# 切片操作-等同于列表
print(s_4[-2:])
- 基本运算(+-*/)index为Key
## 注意:如果索引大小不同,则较小索引的Series中与较大Serise中相同index值为NON
#+
print(s_2+s_5)
print(s_2.add(s_5))
#-
print(s_2-s_5)
print(s_2.sub(s_5))
#*
print(s_2*s_5)
print(s_2.mul(s_5))
#/
print(s_2/s_5)
print(s_2.div(s_5))
#统计
print(s_2.describe())
- 特殊方法——where (对于满足不等式的元素重新赋值)
#创建一个简单的 Series
s = pd.Series([10, 20, 30, 40, 50])#替换所有小于 30 的值为 NaN
result1 = s.where(s >= 30)
print("示例 1:")
print(result1)#替换所有小于 30 的值为 -1
result2 = s.where(s >= 30, -1)
print("\n示例 2:")
print(result2)#使用另一个 Series 作为替代值
alt_values = pd.Series([-1, -2, -3, -4, -5])
result3 = s.where(s >= 30, alt_values)
print("\n示例 3:")
print(result3)
- concat 拼接两个Series
import pandas as pd
s1 = pd.Series([10, 20, 30, 40, 50])
s2 = pd.Series([11, 20, 30, 40, 50])
s3 = pd.concat([s1, s2], ignore_index=True)
print(s3)
三 DataFrame
之前介绍了 Series,在表格中相当于一列的值,但是我们操作表的时候时既有横向的还有列项的。
那现在就需要引入另外一个定义 DataFrame,当读取一个表格的时候会将数据直接转换成DataFrame格式
- DataFrame:A Pandas DataFrame is a 2 dimensional data structure, like a 2 dimensional array ,or a table with rows and columns
import pandas as pdpd.DataFrame(data=None,index=None,columns=None)data:数据
index:设置行的名称
columns: 设置列的名称
- 如何创建 DataFrmae
# 使用字典创建
import pandas as pd
import numpy as np
dict1 = {"xiaoming":[1,2,3],"xiaohong":[3,2,1]}
df1 = pd.DataFrame(dict1)# 使用array创建
data1 = np.arange(18).reshape(3,6)
df2 = pd.DataFrame(data1)
看了很多文章,在介绍什么是DataFrame时候会介绍如何探寻DataFrame中是数据,我认为可以放在数据处理和分析的时候介绍。
四 数据处理
4.1 数据的获取
因业务的不同,数据来源不同,因此获取数据的方式也不一样,数据来源:数据库,excel(xlwx,hmlx,csv),txt等格式
4.11 从数据库获取数据
import pyodbc
from contextlib import contextmanager
from concurrent.futures import ThreadPoolExecutor
import pandas as pd
server = '替换成你的数据库所在的服务器名称'
database = '数据库名称'
username = '用户名'
password = '登陆密码'
driver = '{ODBC Driver 17 for SQL Server}'
# 不同版本的ODBC驱动
#driver = '{ODBC Driver 17 for SQL Server}' # 最新版本
#driver = '{ODBC Driver 13 for SQL Server}' # 较旧版本
#driver = '{SQL Server}' # 系统自带的基础驱动
#driver = '{SQL Server Native Client 11.0}' # Native Client驱动
# 创建连接字符串
conn_str = f'DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}'# 创建连接池
pool = ThreadPoolExecutor(max_workers=5)@contextmanager
def get_connection():conn = pyodbc.connect(conn_str)try:yield connfinally:conn.close()def execute_query(query, params=None):with get_connection() as conn:cursor = conn.cursor()if params:cursor.execute(query, params)else:cursor.execute(query)return cursor.fetchall()
def query_to_dataframe(query, params=None):with get_connection() as conn:try:if params:df = pd.read_sql(query, conn, params=params)else:df = pd.read_sql(query, conn)return dfexcept (pyodbc.Error, pd.io.sql.DatabaseError) as e:print(f"Error executing query: {e}")return None
## 场景1:需要原始数据进行简单处理
raw_data = execute_query("SELECT count(*) FROM users")
user_count = raw_data[0][0]# 场景2:需要进行数据分析
df = query_to_dataframe("SELECT * FROM sales_data WHERE year = 2023")
monthly_sales = df.groupby('month').sum()# 场景3:需要自定义数据库操作
with get_connection() as conn:cursor = conn.cursor()cursor.execute("INSERT INTO logs VALUES (?, ?)", [timestamp, message])conn.commit()
# 场景4:从数据库获取数据并转换成 DataFrame格式
query = "select * from 表名称"
project = pd.read_sql(query, pyodbc.connect(conn_str))
如果你不知道怎么书写,请跟AI交流一下,让它帮你出一个注意
4.12 从excel(xlsx和csv)获取数据
注意:如果是公司Teams上的文件夹中的数据,如果想直接使用pandas读取,需要将Teams上的表格同步到自己的ONEDrive中,然后获取本地电脑中的文件位置,进行读取。会产生同步问题。
-
相对路径和绝对路径
假设当前目录是 C:\Users\张三\project
相对路径示例
"data.xlsx" #当前目录下的文件
"./data.xlsx" #同上,./表示当前目录
"../documents/file.xlsx" #上级目录下的documents文件夹中的文件
"subfolder/image.png" #当前目录下subfolder中的文件
"../../backup/data.sql" #上级的上级目录下backup文件夹中的文件
绝对路径:从文件系统根目录开始的完整路径
- /和\
特性 | / (正斜杠) | \ (反斜杠) |
---|---|---|
原生系统 | Unix/Linux/macOS | Windows |
Python兼容性 | 所有系统都支持 ✅ | 仅Windows原生,但Python可处理 |
URL使用 | 标准格式 ✅ | 不适用 ❌ |
转义问题 | 无问题 ✅ | 需要转义 \\ 或使用 r"" |
跨平台性 | 优秀 ✅ | 较差 ⚠️ |
推荐度 | 高度推荐 ✅ | 特定场景使用 |
因此路径有三种书写方式
/ | "./data.xlsx" |
\\ | ".\\data.xlsx" |
\ | r".\data.xlsx" |
- 函数 read_excel
df = pd.read_excel(
'data.xlsx', # 文件路径
sheet_name=0, # 可以是sheet的名称也可以是数字(0,1,2,3,,,,,)
header=0, # 标题行位置
index_col=None, # 索引列
usecols=None, # 指定读取的列
dtype=None, # 数据类型
engine=None, # 读取引擎
skiprows=None, # 跳过的行数
nrows=None # 读取的行数
)
- 函数 read_csv
df = pd.read_csv('data.csv', # 文件路径或URLsep=',', # 分隔符delimiter=None, # 分隔符的别名header='infer', # 标题行位置names=None, # 列名列表index_col=None, # 索引列usecols=None, # 指定读取的列dtype=None, # 数据类型encoding=None, # 文件编码nrows=None, # 读取的行数skiprows=None # 跳过的行数
)