Pandas
1.Pandas介绍
Pandas是Python第三方库,提供高性能易用数据类型和分析工具。当谈论数据处理和分析时,Pandas 库就像一个强大的工具箱,可以帮助你处理和分析各种类型的数据,从简单的电子表格到大规模的数据集。以下是关于 Pandas 库的通俗介绍
-
数据表格的专家: Pandas 主要用于处理和操作数据表格,就像你在 Excel 或 Google Sheets 中所做的那样。它能够轻松加载、创建、编辑和保存数据表格。
-
强大的数据结构: Pandas 提供两种主要的数据结构,称为DataFrame和Series。DataFrame 是一个二维的数据表格,而 Series 是一维的数据序列。你可以将它们想象成 Excel 表格中的列和行。
-
数据清洗和转换: 数据通常不是完美的,可能存在缺失值、重复项或格式问题。Pandas 提供了各种功能,帮助你轻松地清洗和转换数据,使其适合分析。
-
数据筛选和选择: 你可以使用 Pandas 来选择和过滤数据,只提取你关心的部分。这对于快速查找特定信息非常有用。
-
数据聚合和分组: Pandas 允许你根据某些列的值对数据进行分组,并进行聚合操作,如计算平均值、总和、中位数等统计数据。
-
时间序列数据: 如果你处理时间相关的数据,Pandas 也提供了强大的时间序列支持,可以帮助你分析时间序列数据。
-
数据可视化: Pandas 可以与其他数据可视化库(如Matplotlib和Seaborn)无缝集成,帮助你创建各种类型的图表和图形,以更好地理解数据。
-
数据导入和导出: Pandas 能够读取和写入各种不同格式的数据,包括 CSV、Excel、SQL 数据库、JSON 等等。
-
自动化数据处理: 你可以使用 Pandas 来自动化一些常见的数据处理任务,如数据合并、拆分、透视表的创建等。
总之,Pandas 是一个非常强大而灵活的数据处理和分析库,它为数据科学家、分析师和工程师提供了丰富的工具和函数,使他们能够更轻松地处理和分析各种类型的数据,从而做出更明智的决策。无论是初学者还是专业人士,Pandas 都是一个不可或缺的数据分析工具。
2.Pandas的使用方法
2.1 对象创建
-
Series
对象Series 是带标签数据的一维数组
通用结构: pd.Series(data, index=index, dtype=dtype)
data:数据,可以是列表*,字典或Numpy数组*
index:索引,为可选参数
dtype: 数据类型,为可选参数
import pandas as pd #创建Series对象 a = pd.Series() #a = Series([], dtype: object) #传入列表 #指定下标index b = pd.Series([1,2,3,4,5,6],index=['a','b','c','d','e','f']) ''' a 1 b 2 c 3 d 4 e 5 f 6 dtype: int64 ''' #不指定下标index,默认为0开始 c = pd.Series([1,2,3,4,5,6]) ''' 0 1 1 2 2 3 3 4 4 5 5 6 dtype: int64 ''' #传入字典 e = pd.Series({'name':'lisi','age':14,'sex':'M'}) ''' name lisi age 14 sex M dtype: object '''
-
DataFrame
对象DataFrame 是带标签数据的多维数组
通用结构: pd.DataFrame(data, index=index, columns=columns)
data:数据,可以是列表,字典或Numpy数组
index:索引,为可选参数
columns: 列标签,为可选参数
import pandas as pd dict = {"BeiJing": 2154, "ShangHai": 2424, "ShenZhen": 1303, "HangZhou": 981} data = pd.Series(dict) pd.DataFrame(data) ''' 0 BeiJing 2154 ShangHai 2424 ShenZhen 1303 HangZhou 981 ''' a = pd.DataFrame(data,columns=['123']) ''' 123 BeiJing 2154 ShangHai 2424 ShenZhen 1303 HangZhou 981 '''
总结对比表
特性 | Series | DataFrame |
---|---|---|
维度 | 一维 | 二维 |
结构 | 索引 + 单一列值 | 行索引 + 列索引 + 多列值 |
数据类型 | 所有元素类型一致 | 每列可不同类型 |
用途 | 单一维度数据存储 | 结构化表格数据处理 |
形状表示 | (n,) | (行数,列数) |
2.2 数据查看与基本信息
# 查看前5行(默认)
df.head()
# 查看后3行
df.tail(3)
# 查看形状(行数, 列数)
print(df.shape)
# 查看列名
print(df.columns)
# 查看数据类型和缺失值
df.info()
# 数值型列的统计摘要(均值、标准差等)
df.describe()
'''
123
count 4.000000
mean 1715.500000
std 684.081136
min 981.000000
25% 1222.500000
50% 1728.500000
75% 2221.500000
max 2424.000000
'''
函数解析
-
head()
:查看数据前几行 -
tail()
:查看数据后几行 -
shape()
:查看形状 -
info()
:查看数据类型与缺失值 -
columns
:查看列名 -
describe()
:数据的统计摘要
2.3 数据筛选与查询
-
按列筛选
# 选择单列(返回Series) ages = df['Age'] # 选择多列(返回DataFrame) sub_df = df[['Name', 'City']]
-
按行筛选
# 年龄大于30的行 filtered = df[df['Age'] > 30] # 城市为'London'且年龄小于35的行 filtered = df[(df['City'] == 'London') & (df['Age'] < 35)]
-
按索引筛选
# 按标签索引(loc) row = df.loc[1] # 第2行(索引为1) sub_df = df.loc[1:3, ['Name', 'Age']] # 行1-3,列Name和Age # 按位置索引(iloc) row = df.iloc[0] # 第1行(位置0) sub_df = df.iloc[0:2, 0:2] # 前2行,前2列
2.4 数据清洗
-
处理缺失值
# 检查缺失值(每列缺失值数量) df.isnull().sum() # 删除含缺失值的行(how='all'表示全为缺失值才删除) df.dropna(axis=0, how='any', inplace=True) # 填充缺失值(用均值填充Age列) df['Age'].fillna(df['Age'].mean(), inplace=True)
函数解析
-
isnull()
:对 DataFrame 中的每个元素进行判断,若为缺失值(NaN
、None
等),则标记为True
;否则标记为False
-
num()
:对df.isnull()
返回的布尔型 DataFrame 进行求和。在 Pandas 中,True
会被当作1
,False
当作0
,因此求和结果即每列的缺失值数量。 -
dropna()
:删除 DataFrame 中存在缺失值(NaN
、None
等)的行或列,具体删除行还是列由axis
参数决定。-
**
axis
**指定删除方向:axis=0
(默认值):删除包含缺失值的行;- 若改为
axis=1
:删除包含缺失值的列。
-
**
how
**指定删除条件:how='any'
(默认值):只要行 / 列中存在至少 1 个缺失值,就删除该行 / 列;- 若改为
how='all'
:只有当行 / 列中所有值都是缺失值时,才删除该行 / 列。
-
**
inplace
**指定操作方式:inplace=True
:直接在原 DataFrame 上修改(删除后原数据会变化);- 若改为
inplace=False
(默认值):不修改原数据,而是返回一个删除缺失值后的新 DataFrame(需用变量接收,如new_df = df.dropna(...)
)。
-
fillna()
:填充缺失值
-
-
-
去重
# 检查重复行 df.duplicated().sum() # 删除重复行(保留第一行) df.drop_duplicates(inplace=True)
函数解析
-
duplicated()
:检查重复行 -
drop_duplicates()
:-
inplace=True
:表示直接在原 DataFrame 上修改(删除重复行),不返回新对象; -
若设为
False
(默认),则会返回一个删除重复行后的新 DataFrame,原 DataFrame 保持不变。
-
-
-
数据类型转换
# 将字符串类型的日期转为datetime df['Date'] = pd.to_datetime(df['Date']) # 将Age列转为整数 df['Age'] = df['Age'].astype(int)
2.5 数据分组与聚合
类似 SQL 的 GROUP BY 操作:
# 按City分组,计算每组的平均年龄
city_age_mean = df.groupby('City')['Age'].mean()
# 多列聚合(计算每组的年龄均值和人数)
agg_result = df.groupby('City').agg({
'Age': ['mean', 'count'],
'Name': 'nunique' # 不同姓名的数量
})
2.6 数据合并与连接
# 横向合并(类似SQL的JOIN)
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['A', 'B', 'C']})
df2 = pd.DataFrame({'ID': [2, 3, 4], 'Age': [20, 30, 40]})
merged = pd.merge(df1, df2, on='ID', how='inner') # 内连接
# 纵向拼接(添加行)
df3 = pd.DataFrame({'ID': [5], 'Name': ['D']})
concatenated = pd.concat([df1, df3], ignore_index=True) # 忽略原索引
2.7 场景操作
-
列操作
# 添加新列(年龄加5) df['Age_plus_5'] = df['Age'] + 5 # 重命名列 df.rename(columns={'City': 'City_Name'}, inplace=True) # 删除列 df.drop(columns=['Age_plus_5'], inplace=True)
-
排序操作
# 按Age升序排序(默认) df.sort_values(by='Age', inplace=True) # 按City降序、Age升序排序 df.sort_values(by=['City', 'Age'], ascending=[False, True], inplace=True)
-
字符串处理
# 提取Name列的首字母 df['Name_Init'] = df['Name'].str[0] # 转换为小写 df['City_Lower'] = df['City'].str.lower()
3 文件的读取与写入
3.1 文件的写入
-
写入CSV文件:
import pandas as pd data_read_path =r"F:\joyful-pandas-master\data\my_csv.csv" data_write_path = r"F:\joyful-pandas-master\data\my_csv_saved.csv" data = pd.read_csv(data_read_path) data.to_csv(data_write_path, index=False) # 此时不能打开被写的文件
data.to_csv(data_write_path, index=False)
把data中的数据 ,写入到data_write_path 中,且设置去除索引操作 -
写入TXT文件:
data.to_csv('data/my_txt_saved.txt', sep='\t', index=False)
写txt文件使用的是:
.to_csv()方法
记得设置分割方式:sep -
写入Excel文件:
data.to_excel('data/my_excel_saved.xlsx', index=False)
3.2 文件的读取
-
读CSV文件:
import pandas as pd data=pd.read_csv('path',sep=',',header=0,names=["第一列","第二列","第三列"],encoding='utf-8')
-
path: 要读取的文件的绝对路径
-
sep:指定列和列的间隔符,默认sep=‘,’
-
若sep=‘’\t",即列与列之间用制表符\t分割,相当于tab——四个空格
-
header:列名行,默认为0
-
names:列名命名或重命名
-
encoding:指定用于unicode文本编码格式
-
-
读TXT文件:
import pandas as pd # 从CSV文件读取数据 df = pd.read_csv('example.csv',header=None) print(df)
- 其中
header=None
用于告诉Pandas不要将第一行数据解释为列名,而是将其作为数据的一部分。
- 其中
-
读Excel文件:
import pandas as pd # 从Excel文件读取数据 df = pd.read_excel('example.xlsx',header=None) print(df)