pandas数据分析

article/2025/7/6 22:22:18

数据读取

import pandas as pd
df = pd.read_csv('D:\my_app\python\python project\data\sample_data.csv')
print(df)

数据保存

import pandas as pd# 创建示例数据
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],'Age': [25, 30, 35, 28, 22],'City': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou']
}# 创建 DataFrame
df = pd.DataFrame(data)# 指定保存路径和文件名
file_path = r'D:\my_app\python\python project\data\sample_data.csv'# 保存为 CSV 文件
df.to_csv(file_path, index=False)print(f"数据已保存到: {file_path}")

输出首行和输出最后三行

import pandas as pddf = pd.read_csv('D:\my_app\python\python project\data\sample_data.csv')
# print(df.head(1))
print(df.tail(3))

使用 dtypes 检查列类型

在这里插入图片描述

import pandas as pddf = pd.read_csv('D:\my_app\python\python project\data\sample_data.csv')print(df.dtypes)

在这里插入图片描述

使用 describe() 进行汇总统计(计数、平均值、标准差、最小值、最大值等)。

在这里插入图片描述

import pandas as pddf = pd.read_csv('D:\my_app\python\python project\data\sample_data.csv')print(df.describe())

在这里插入图片描述

计算平均值

import pandas as pddf = pd.read_csv('D:\my_app\python\python project\data\sample_data.csv')avg_age = df['Age'].mean()
print(f"Average age: {avg_age}")

寻找缺失值

import pandas as pddf = pd.read_csv('D:\my_app\python\python project\data\sample_data.csv')missing_count = df['Age'].isna().sum()
print(f"Missing age values: {missing_count}")

.isna() 是 pandas 中的一个方法,用于检查“年龄”系列中的每个值是否缺失(即 NaN 、 None 或 pandas 中缺失数据的其他表示)。

它返回一个长度相同的新系列,其中如果 df[‘Age’] 中的相应值缺失,则每个元素为 True ,否则为 False 。

df.to_csv() 方法用于将 DataFrame 保存到 CSV 文件。

import pandas as pd# Create DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],'Age': [25, 30, 35, 28, 22],'City': ['Beijing', 'Shanghai', 'Guangzhou', ' quellesShenzhen', 'Hangzhou']
}
df = pd.DataFrame(data)# Save to CSV
df.to_csv(r'D:\my_app\python\python project\data\sample_data.csv', index=False)

索引

索引loc

import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['x', 'y', 'z']}, index=['a', 'b', 'c'])
print(df.loc['a', 'A'])  # Select value at index 'a' and column 'A'
print(df.loc[df['A'] > 1, ['B']])  # Filter and select column

在这里插入图片描述
第二个输出

索引iloc

iloc :基于整数的位置选择(使用行/列位置)。
数字索引推荐

import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['x', 'y', 'z']}, index=['a', 'b', 'c'])print(df.iloc[0, 0])  # First row, first column
print(df.iloc[1:3, 0])  # Rows 1 to 2, first column

Boolean Filtering

df = pd.DataFrame({'Age': [25, 30, 35, 28, 22]})
filtered_df = df[df['Age'] > 30]
print(filtered_df)

在这里插入图片描述

Multiple Conditions: Combine with & (and), | (or), and ~ (not), using parentheses

import pandas as pddf = pd.DataFrame({'Age': [25, 30, 35, 28, 22]})
filtered_df = df[(df['Age'] > 25) & (df['Age'] < 35)]
print(filtered_df)

在这里插入图片描述

Adding a Column

Adding a Column: Assign a new column or compute from existing ones

import pandas as pddf = pd.DataFrame({'Age': [25, 30, 35, 28, 22]})
df['New_Column'] = df['Age'] + 5
print(df)

在这里插入图片描述

删除列的两种方法

import pandas as pddf = pd.DataFrame({'Age': [25, 30, 35, 28, 22]})
df['New_Column'] = df['Age'] + 5
# print(df)
df = df.drop('New_Column', axis=1)  # axis=1 for columns
# or
# del df['New_Column']
print(df)

1。df = df.drop('New_Column', axis=1) # axis=1 for columns
axis=0为列,axis=1为行
2.del df['New_Column']

修改列 :直接更新值。

import pandas as pddf = pd.DataFrame({'Age': [25, 30, 35, 28, 22]})
df['Age'] = df['Age'] * 2print(df)

在这里插入图片描述

我们将使用 str.startswith() 过滤城市以“S”开头的行。

# Load the CSV file
df = pd.read_csv(r'D:\my_app\python\python project\data\sample_data.csv')
# Filter rows where City starts with 'S'
filtered_df = df[df['City'].str.startswith('S')]
print(filtered_df)

创建一个新列“Senior”(如果年龄 > 30 则为 True,否则为 False)

import pandas as pd# Load the CSV file
df = pd.read_csv(r'D:\my_app\python\python project\data\sample_data.csv')
df['Senior'] = df['Age'] > 30
print(df)

在这里插入图片描述

Detecting Missing Values: Use isna() or isnull() to check for missing data.

import pandas as pd
df = pd.DataFrame({'A': [1, None, 3], 'B': ['x', 'y', None]})
print(df.isna())

在这里插入图片描述

fillna() :用特定值或方法(例如平均值)填充缺失值。

import pandas as pd
df = pd.DataFrame({'A': [1, None, 3], 'B': ['x', 'y', None]})
df_filled = df.fillna(0)  # Replace NaN with 0
print(df_filled)

在这里插入图片描述

dropna() :删除缺少值的行或列。

import pandas as pd
df = pd.DataFrame({'A': [1, None, 3], 'B': ['x', 'y', None]})
df_dropped = df.dropna()  # Drop rows with any NaN
print(df_dropped)

在这里插入图片描述

数据类型转换

astype() :更改列的数据类型(例如,从字符串更改为整数)。

import pandas as pd
df = pd.DataFrame({'A': ['1', '2', '3']})
df['A'] = df['A'].astype(int)
print(df.dtypes)

在这里插入图片描述

例子

创建一个 DataFrame,其中 Age 列为字符串(例如,[‘25’, ‘30’, ‘invalid’])。
将年龄转换为整数类型,处理无效值。
检查结果数据类型。

import pandas as pd# Create a DataFrame with an 'Age' column as strings
df = pd.DataFrame({'Age': ['25', '30', 'invalid']})# Convert 'Age' to integer, handling invalid values
df['Age'] = pd.to_numeric(df['Age'], errors='coerce').astype('Int64')# Check the resulting data types
print(df)
print("\nData types:")
print(df.dtypes)

pd.to_numeric 尝试将每个值解析为数字。
errors='coerce' 参数确保无效值(如 'invalid' )转换为 NaN (非数字)而不是引发错误。
此步骤将有效字符串( ‘25’ , ‘30’ )转换为数字(例如, 25.0 , 30.0 ),并将 ‘无效’ 转换为 NaN
.astype('Int64') 将结果数值转换为 pandas 的可空整数类型 Int64

在这里插入图片描述

删除重复项

drop_duplicates() :根据所有或特定列删除重复的行。
import pandas as pd
df = pd.DataFrame({'A': [1, 1, 2], 'B': ['x', 'x', 'y']})
df_unique = df.drop_duplicates()
print(df_unique)

在这里插入图片描述

子集参数 :根据特定列删除重复项。
import pandas as pd
df = pd.DataFrame({'A': [1, 1, 2], 'B': ['x', 'x', 'y']})df_unique_subset = df.drop_duplicates(subset=['A'])
print(df_unique_subset)

字符串处理

str 方法 :常用方法包括 str.lower() 、 str.upper() 、 str.replace() 。(大小写替换)
import pandas as pddf = pd.DataFrame({'City': ['Beijing', 'SHANGHAI', 'guangzhou']})
df['City'] = df['City'].str.lower()  # Convert to lowercase
df['City'] = df['City'].str.replace('g', 'G')  # Replace 'g' with 'G'
print(df)

在这里插入图片描述

str.strip() 、 str.contains() 用于清理或过滤。

strip() 方法从列中的每个字符串中删除所有前导(在开始处)或尾随(在结尾处)的空白字符(空格、制表符或换行符)。

规范化文本数据

import pandas as pd# Load data
df = pd.read_csv(r'D:\my_app\python\python project\data\sample_data.csv')# Add missing value and outlier
df.loc[0, 'Age'] = None  # Missing value
df.loc[1, 'Age'] = 150   # Outlier# Fill missing values with mean
df['Age'] = df['Age'].fillna(df['Age'].mean())# Drop outliers (Age > 100)
df = df[df['Age'] <= 100]# Convert Age to integer
df['Age'] = df['Age'].astype(int)# Normalize City to lowercase
df['City'] = df['City'].str.lower()# Save cleaned data
df.to_csv(r'D:\my_app\python\python project\data\cleaned_data.csv', index=False)
print(df)

df.loc[0, 'Age'] = None 将索引 0 处的行的 ‘Age’ 值设置为 None ,从而引入缺失值(pandas 将其视为 NaN )。
df.loc[1, 'Age'] = 150 将索引 1 处的行的“Age”值设置为 150 ,引入异常值(异常高的年龄,可能不切实际)。

df['Age'].fillna(df['Age'].mean()) 将“Age”列中的缺失值( NaN )替换为该列中非缺失值的平均值。
df = df[df['Age'] <= 100] 过滤 DataFrame 以仅保留“Age”值小于或等于 100 的行。

df['Age'] = df['Age'].astype(int) 将 ‘Age’ 列转换为标准 Python 整数类型 ( int )。
用平均值填充缺失值后,“年龄”列可能包含浮点数(例如 73.33 )。 .astype(int) 方法会截断小数部分(例如, 73.33 变为 73 )。

注意:此操作假设在 fillna 步骤后,“Age” 中的所有值均不为空,因为 int 不支持 NaN 。(如果保留 NaN 值,则需要使用 Int64 。)

在这里插入图片描述

例子

加载更大的数据集(例如,来自 Kaggle 或创建一个具有 20 行以上的数据集)。
使用不同的策略处理缺失值(例如,使用 fillna(method=‘ffill’) 进行正向填充)。
删除重复项并清理文本(例如,使用 str.strip() 删除多余的空格)。
保存并比较原始数据集和清理后的数据集。

import pandas as pd
import numpy as np
import os# Ensure the output directory exists
output_dir = r'D:\my_app\python\python project\data'
os.makedirs(output_dir, exist_ok=True)# Set random seed for reproducibility
np.random.seed(42)# Create synthetic dataset
data = {'Name': ['  John Doe  ', 'Alice Smith', 'Bob Johnson  ', '  Mary Brown', 'John Doe','Tom Wilson ', np.nan, 'Sarah Davis', '  Emma Clark ', 'Michael Lee','John Doe', 'Alice Smith', 'David Kim  ', 'Lisa White', np.nan,'Chris Evans', 'Anna Taylor  ', 'Mark Chen', '  Jane Doe', 'Tom Wilson','Emily Green', '  Paul Adams ', 'Laura King', 'James Lee', '  Amy Chen  '],'Age': [25, 30, np.nan, 45, 25, 35, 28, np.nan, 50, 32,25, 30, 40, np.nan, 27, 33, 29, 60, 45, 35,np.nan, 41, 26, 38, 31],'City': [' New York ', 'Paris  ', '  Tokyo', 'London ', 'New York','  Sydney', 'Berlin  ', np.nan, '  Tokyo ', 'Paris',' New York', 'Paris', '  Berlin ', 'London', 'Chicago ',np.nan, 'Sydney ', 'Tokyo', '  London', 'Sydney',' Chicago', 'Berlin', '  Paris ', 'Tokyo  ', np.nan],'Purchase_Amount': [100.50, 200.75, 150.00, np.nan, 100.50, 300.25, 175.00, 250.00, 400.00, np.nan,100.50, 200.75, 180.00, 220.00, np.nan, 190.00, 310.00, np.nan, 260.00, 300.25,270.00, 230.00, 210.00, np.nan, 320.00]
}# Create original DataFrame
df_original = pd.DataFrame(data)# Create a copy for cleaning
df = df_original.copy()# Check duplicates before cleaning
print("Duplicates in original:", df.duplicated().sum())# Clean text first to ensure duplicates are correctly identified
df['Name'] = df['Name'].str.strip()
df['City'] = df['City'].str.strip()# Remove duplicates
df = df.drop_duplicates()
print("Duplicates after drop:", df.duplicated().sum())# Handle missing values
df['Name'] = df['Name'].ffill()
df['City'] = df['City'].ffill()
df['Age'] = df['Age'].fillna(df['Age'].mean())
df['Purchase_Amount'] = df['Purchase_Amount'].fillna(df['Purchase_Amount'].median())# Convert 'Age' to integer
df['Age'] = df['Age'].astype(int)# Save both datasets to the same Excel file in different sheets
output_path = os.path.join(output_dir, 'datasets.xlsx')
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:df_original.to_excel(writer, sheet_name='Original', index=False)df.to_excel(writer, sheet_name='Cleaned', index=False)# Compare datasets
print("\nOriginal Dataset:")
print(df_original)
print("\nCleaned Dataset:")
print(df)
print("\nSummary of Changes:")
print(f"Original shape: {df_original.shape}")
print(f"Cleaned shape: {df.shape}")
print(f"Missing values in original:\n{df_original.isna().sum()}")
print(f"Missing values in cleaned:\n{df.isna().sum()}")

http://www.hkcw.cn/article/ARdDrxqSde.shtml

相关文章

力扣每日一题——找到离给定两个节点最近的节点

目录 题目链接&#xff1a;2359. 找到离给定两个节点最近的节点 - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法一&#xff1a;双指针路径交汇法​ 基本思路 关键步骤 为什么这样可行呢我请问了&#xff1f; 举个例子 特殊情况 Java写法&#xff1a; C写法&a…

一种通用图片红色印章去除的工具设计

朋友今天下午需要处理个事情&#xff0c;问我有没有什么好的办法能够去除&#xff0c;核心问题是要去除图片上的印章。记得以前处理过类似的需求&#xff0c;photoshop操作比较简单&#xff0c;本质是做运算。这种处理方式有很多&#xff0c;比如现在流行的大模型&#xff0c;一…

Bean对象循环依赖

Spring 循环依赖是指 多个 Bean 对象之间形成相互依赖的闭环。 三级缓存解决循环依赖 缓存级别存储内容作用一级缓存完整的 Bean&#xff08;singletonObjects&#xff09;存放已初始化完成的 Bean二级缓存半成品 Bean&#xff08;earlySingletonObjects&#xff09;存放已实例…

文心快码参编国内首个软件开发智能体技术规范

近期&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;与中国工商银行、北京兴云数科技术有限公司、北京百度网讯科技有限公司牵头&#xff0c;联合农业银行、邮储银行、科大讯飞、腾讯、阿里、华为等二十余家头部企业&#xff0c;共同编制并正式发布…

【笔记】Windows 系统安装 Supabase CLI 完整指南(基于 Scoop)

#工作记录 前言 在进行开源项目 Suna 部署过程中&#xff0c;执行设置向导时遭遇报错&#xff1a;❌ Supabase CLI is not installed. 根据官方文档指引&#xff0c;需通过 Windows 包管理工具Scoop安装 Supabase CLI。 安装步骤记录 步骤 1&#xff1a;确保 Scoop 已正确安…

深圳南山沙河社区联合心美行动举办“青少年天赋提升”助青春成长

2025年5月29日——在六一国际儿童节到来之际&#xff0c;深圳市南山区沙河街社区联合北京红十字基金会了凡积善之家心美行动志愿团&#xff0c;共同举办“青少年能力天赋提升”主题公益讲座。活动特邀心美行动发起人、中韩医学文化特使、国际高级心理咨询师陈艳林女士担任主讲嘉…

allWebPlugin中间件VLC专用版之截图功能介绍

背景 VLC控件原有接口具有视频截图方法&#xff0c;即video对象的takeSnapshot方法&#xff0c;但是该方法返回的是一个IPicture对象&#xff0c;不适合在谷歌等现代浏览器上使用。因此&#xff0c;本人增加一个新的视频截图方法takeSnapshot2B64方法&#xff0c;直接将视频截图…

深度解析MCP协议

全面解读MCP协议&#xff1a;从技术原理到实践应用 ©作者|Monalisa 来源|神州问学 什么是MCP协议 MCP&#xff08;ModelContextProtocol&#xff09;是Anthropic在2024年11月推出的开放协议&#xff0c;旨在标准化大型语言模型与外部数据源、工具之间的交互方式。简单来…

Qt5.14.2编译的MySQL5.7.25对应64位驱动文件下载:项目核心功能/场景

Qt5.14.2编译的MySQL5.7.25对应64位驱动文件下载&#xff1a;项目核心功能/场景 【下载地址】Qt5.14.2编译的MySQL5.7.25对应64位驱动文件下载 此项目为开发者提供了Qt5.14.2编译环境下&#xff0c;MySQL5.7.25版本的64位驱动文件&#xff0c;包含libqsqlmysql.a、qsqlmysql.dl…

一文完成 Docker 部署Canel 并配置ES与MySQL 的数据同步

Docker 部署Canel 并且配置ES与MySQL 的数据同步 前期配置 开启MySQL binlog日志 [mysqld] log-binmysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server_id1 # 配置 MySQL replaction 需要定义&#xff0c;不要和 canal 的 slaveId 重复创建 Canal 用户并授权…

mysql的锁-->一篇读懂所有锁机制

目录 mysql的锁 概述&#xff1a;根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁&#xff1f; 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…

免费送源码:Java+C+++MySQL C++学生信息管理系统的设计与实现 计算机毕业设计原创定制

目 录 1 绪论 1 1.1选题背景 1 1.2课题研究意义 1 1.3论文结构与章节安排 1 2 相关技术介绍 3 2.1 C语言 3 2.2 Mysql数据库 3 3 系统分析 3 3.1 可行性分析 3 3.1.1 技术可行性分析 3 3.1.2 经济可行性分析 3 3.1.3 法律可行性分析 3 3.2 系统功能分析 3 3.2.1…

达梦DTS数据迁移工具生产篇(MySQL->DM8)

本文章使用的DTS工具为 2024年9月18日的版本&#xff0c;使用的目的端DM8数据库版本为2023年12月的版本&#xff0c;注意数据库版本和DTS版本之间跨度不要太大&#xff0c;以免出现各种兼容性的报错。若发现版本差距过大时&#xff0c;请联系达梦技术服务工程师处理。 1. 迁移…

MySQL 数据库备份与还原

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月18日 专栏&#xff1a;MySQL教程 思维导图 备份 (Backup) 与 冗余 (Redundancy) 的核心区别: &#x1f3af; 备份是指创建数据的副本并将其存储在不同位置或介质&#xff0c;主要目的是在发生数据丢失、损坏或逻辑错误时进…

MySQL Binlog 日志查看方法及查看内容解析

一、Binlog 日志概述 Binlog&#xff08;二进制日志&#xff09;记录了 MySQL 数据库执行的所有更改数据的操作&#xff0c;包括INSERT、UPDATE、DELETE等。它对于数据恢复、主从复制以及审计等方面有着至关重要的作用。 二、查看 Binlog 日志方法 开启 Binlog 日志功能 默…

【金仓数据库征文】金仓数据库(KingbaseES)迁移与集群部署实战:从MySQL到KES的全流程解析

随着企业信息化和数字化转型的加速&#xff0c;企业对数据库的要求不仅仅局限于基础的数据存储功能&#xff0c;更涉及到性能、可扩展性、安全性、以及持续的系统升级能力。因此&#xff0c;数据库迁移已经成为现代企业升级IT架构时的一个重要步骤。特别是在国产化替代的浪潮中…

【MySQL】 基本查询(下)

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 基本查询(下) 发布时间:2025.2.18 隶属专栏:MySQL 目录 Update语法案例Delete删除数据语法案例截断表语法案例插入查询结果语法案例聚合函数函数介绍案例group by子句的使用语法having和where案例结语Update 语法 UPDATE …

MySQL开大招了! 三十周年庆典推出四项 OCP 认证免费

&#x1f389; MySQL 30岁生日大礼包&#xff01;OU掏家底了&#xff01; 狠心决定&#xff1a;4.20-7.31期间 &#x1f525;全系列MySQL课程四大认证 &#x1f525;原价$2,500/人的考试资格 通&#xff01;通&#xff01;免&#xff01;费&#xff01; &#x1f4a1;30年只此一…

Kettle9.1链接mysql报错: Connection failed. Verify all connection parameters and confirm that the appropr

Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed. The server time zone value ‘D1’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC 连接失败。验证所…

2025最新版|八股文面试题库+答案详解(附高频考点解析)

我相信大多 Java 开发的程序员或多或少经历过 BAT 一些大厂的面试&#xff0c;也清楚一线互联网大厂 Java 面试是有一定难度的&#xff0c;小编经历过多次面试&#xff0c;有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#xff…