Pandas 是一个Python数据分析库,它提供了高性能、易于使用的数据结构和数据分析工具。这个库适用于处理和分析输入数据,常见于统计分析、金融分析、社会科学研究等领域。
1.Pandas的核心功能
Pandas 库的核心功能包括:
1.数据结构:Pandas 提供了两种主要的数据结构——DataFrame
和 Series
。DataFrame
是一个表格型的数据结构,可以想象成一个关系型数据表,具有可变的行和列。Series
是一个一维的标签数组,能够保存任何数据类型(整数、字符串、浮点数等)。
2.数据操作:Pandas 支持对数据进行插入、删除、合并、切片、聚合和重塑等多种操作。
3.处理缺失数据:Pandas 能够轻松处理缺失数据(例如:NaN
)。
4.文件操作:Pandas 支持直接从或保存到多种文件格式如 CSV、Excel、SQL 数据库以及 HDF5 格式。
5.时间序列分析:Pandas 对时间序列数据有优秀的处理能力,能够进行日期范围生成、频率转换、移动窗口统计等操作。
因此,Pandas 是数据科学和量化分析领域中不可或缺的工具之一,用于数据清洗、分析以及准备数据用于进一步的统计或机器学习处理。
2.Pandas的使用
(1)Series数据结构
Series
对象是Pandas库中的基本数据结构之一,它主要用于单维度的数据集合(整数、浮点数、字符串、Python 对象等)。这种数据结构广泛应用于数据分析、数据清洗以及数据预处理过程中。该对象支持各种操作,如算术运算、聚合函数(求和、平均、最大值等)和条件过滤。同时,Series
非常适合处理时间序列数据。它可以有一个时间索引,这使得进行时间序列分析(如趋势分析、季节性调整等)变得更加直接和高效。此外,Pandas 还允许Series
对象与其他数据结构(如DataFrame
)无缝工作,可以方便地从 Series
转换到 DataFrame
,反之亦然。
import pandas as pd # 导入库并设置别名为‘pd’
import numpy as np # 导入库并设置别名为‘np’
import matplotlib.pyplot as plt
# 创建一个Series对象:传递一个数值列表作为参数,令Pandas使用默认索引
s=pd.Series([1,2,4,np.nan,6,7,9,10]) # 其中np.nan是numpy中的特殊值,表示非数字(Not a Number),它通常用于表示缺失值或未定义的数值
print(s)
# 输出:
'''
0 1.0
1 2.0
2 4.0
3 NaN
4 6.0
5 7.0
6 9.0
7 10.0
dtype: float64
'''
(2)创建DataFrame对象
DataFrame
是一个二维的、表格型的数据结构,它可以存储多种类型的数据(整数、浮点数、字符串、Python 对象等),并且具有行和列的标签。
# 创建一个DataFrame对象:传递datetime索引和列标签的Numpy数组作为参数
# 首先创建一个时间序列,代码生成一个DatetimeIndex,包含从2013-01-01到2013-01-06的六个连续日期。
dates=pd.date_range('20130101',periods=6)
print(dates)
#创建DataFrame对象,指定index和columns标签
df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD')) # 生成一个6行4列的列表,元素是从标准正态分布中抽取的随机数
print(df)
# 输出:
'''
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
A B C D
2013-01-01 -1.357961 0.850011 -0.636005 0.425649
2013-01-02 0.144545 -0.353026 0.128698 -0.038226
2013-01-03 -0.690415 0.217009 -0.038996 -1.387236
2013-01-04 -0.696815 -1.212856 -0.177951 -0.218372
2013-01-05 0.697114 -1.213185 -1.968390 0.825755
2013-01-06 1.019140 -0.733800 1.117218 0.990784
'''
查看数据:
# 观察数据
# 查看一个DataFrame对象的前几行和最后几行
print(df.head())
print(df.tail(3))
# 默认情况下 .head()和.tail()输出首尾的前5行,也可以指定输出行数
# 输出:
'''
A B C D
2013-01-01 -1.357961 0.850011 -0.636005 0.425649
2013-01-02 0.144545 -0.353026 0.128698 -0.038226
2013-01-03 -0.690415 0.217009 -0.038996 -1.387236
2013-01-04 -0.696815 -1.212856 -0.177951 -0.218372
2013-01-05 0.697114 -1.213185 -1.968390 0.825755
A B C D
2013-01-04 -0.696815 -1.212856 -0.177951 -0.218372
2013-01-05 0.697114 -1.213185 -1.968390 0.825755
2013-01-06 1.019140 -0.733800 1.117218 0.990784
'''
查看列表索引、列表标签、值并统计:
#查看索引
print(df.index)
#列表签
print(df.columns)
#数值
print(df.values)
#统计
print(df.describe())
'''
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
Index(['A', 'B', 'C', 'D'], dtype='object')
[[-1.35796107 0.85001062 -0.63600535 0.4256489 ]
[ 0.14454457 -0.35302596 0.128698 -0.03822612]
[-0.69041478 0.217009 -0.03899589 -1.38723616]
[-0.696815 -1.21285587 -0.17795143 -0.21837225]
[ 0.69711448 -1.21318519 -1.96839039 0.82575471]
[ 1.01914038 -0.73379976 1.11721757 0.99078445]]
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean -0.147399 -0.407641 -0.262571 0.099726
std 0.918851 0.822011 1.016201 0.867018
min -1.357961 -1.213185 -1.968390 -1.387236
25% -0.695215 -1.093092 -0.521492 -0.173336
50% -0.272935 -0.543413 -0.108474 0.193711
75% 0.558972 0.074500 0.086775 0.725728
max 1.019140 0.850011 1.117218 0.990784
'''
灵活使用DataFrame对象如转置、排序:
# 转置
print(df.T)
# 按列排序,逐步递减
print(df.sort_index(axis=1,ascending=False))
# 按值排序,‘B’列逐行递增
print(df.sort_values(by='B'))
# 输出:
'''
2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06
A -1.357961 0.144545 -0.690415 -0.696815 0.697114 1.019140
B 0.850011 -0.353026 0.217009 -1.212856 -1.213185 -0.733800
C -0.636005 0.128698 -0.038996 -0.177951 -1.968390 1.117218
D 0.425649 -0.038226 -1.387236 -0.218372 0.825755 0.990784
D C B A
2013-01-01 0.425649 -0.636005 0.850011 -1.357961
2013-01-02 -0.038226 0.128698 -0.353026 0.144545
2013-01-03 -1.387236 -0.038996 0.217009 -0.690415
2013-01-04 -0.218372 -0.177951 -1.212856 -0.696815
2013-01-05 0.825755 -1.968390 -1.213185 0.697114
2013-01-06 0.990784 1.117218 -0.733800 1.019140
A B C D
2013-01-05 0.697114 -1.213185 -1.968390 0.825755
2013-01-04 -0.696815 -1.212856 -0.177951 -0.218372
2013-01-06 1.019140 -0.733800 1.117218 0.990784
2013-01-02 0.144545 -0.353026 0.128698 -0.038226
2013-01-03 -0.690415 0.217009 -0.038996 -1.387236
2013-01-01 -1.357961 0.850011 -0.636005 0.425649
'''
打印特定行或特定列的数据:
print(df["A"]) # 与df.A相同,打印A列
print(df.A)
# 使用[]分割DataFrame
print(df[0:3]) # 选取0-2行即前三行进行打印
print(df['20130102':'20130104']) # 选取从2013-01-02到2013-01-04的行打印,包含开始和结束日期
# 输出:
'''
2013-01-01 -1.357961
2013-01-02 0.144545
2013-01-03 -0.690415
2013-01-04 -0.696815
2013-01-05 0.697114
2013-01-06 1.019140
Freq: D, Name: A, dtype: float64
2013-01-01 -1.357961
2013-01-02 0.144545
2013-01-03 -0.690415
2013-01-04 -0.696815
2013-01-05 0.697114
2013-01-06 1.019140
Freq: D, Name: A, dtype: float64
A B C D
2013-01-01 -1.357961 0.850011 -0.636005 0.425649
2013-01-02 0.144545 -0.353026 0.128698 -0.038226
2013-01-03 -0.690415 0.217009 -0.038996 -1.387236
A B C D
2013-01-02 0.144545 -0.353026 0.128698 -0.038226
2013-01-03 -0.690415 0.217009 -0.038996 -1.387236
2013-01-04 -0.696815 -1.212856 -0.177951 -0.218372
'''
按照标签选择数据:
# 按标签选择,选中一行
print(df.loc[dates[0]])
# 标签选中复制数列(所有行,输出只显示前5行)
print(df.loc[:,['A','B']])
# 行,列同时切分(包括起止点)
print(df.loc['20130102':'20130104',['A','B']])
# 返回一个元素(两种等效)
print(df.loc[dates[0],'A'])
print(df.at[dates[0],'A'])
# 输出:
'''
A -0.096276
B -0.840584
C -0.425912
D 0.052560
Name: 2013-01-01 00:00:00, dtype: float64
A B
2013-01-01 -0.096276 -0.840584
2013-01-02 1.790104 0.303063
2013-01-03 1.326804 -0.272038
2013-01-04 0.843435 -0.475088
2013-01-05 1.207635 -0.462329
2013-01-06 -0.374454 0.297715
A B
2013-01-02 1.790104 0.303063
2013-01-03 1.326804 -0.272038
2013-01-04 0.843435 -0.475088
-0.09627595683105973
-0.09627595683105973
'''
按照位置选择数据:
# 按位置选择
# 位置索引为3的列,(从0开始,所以其实是第4列)
print(df)
print(df.iloc[3])
# 按位置索引分割DataFrame
print(df.iloc[3:5,0:2])
# 指定定位一个特定元素
print(df.iloc[1,1])
print(df.iat[1,1])
# 输出:
'''
A B C D
2013-01-01 -0.096276 -0.840584 -0.425912 0.052560
2013-01-02 1.790104 0.303063 -0.747674 -0.304015
2013-01-03 1.326804 -0.272038 -0.602406 1.508931
2013-01-04 0.843435 -0.475088 0.241588 1.428372
2013-01-05 1.207635 -0.462329 -0.080737 -1.677173
2013-01-06 -0.374454 0.297715 -0.815562 -0.574843
A 0.843435
B -0.475088
C 0.241588
D 1.428372
Name: 2013-01-04 00:00:00, dtype: float64
A B
2013-01-04 0.843435 -0.475088
2013-01-05 1.207635 -0.462329
0.30306280237692435
0.30306280237692435
'''
使用布尔值进行索引:
# 布尔值索引
print(df.A>0)
# 使用.isin函数过滤数据
df2=df.copy()
df2
# 输出:
'''
2013-01-01 False
2013-01-02 True
2013-01-03 True
2013-01-04 True
2013-01-05 True
2013-01-06 False
Freq: D, Name: A, dtype: bool
A B C D
2013-01-01 -0.096276 -0.840584 -0.425912 0.052560
2013-01-02 1.790104 0.303063 -0.747674 -0.304015
2013-01-03 1.326804 -0.272038 -0.602406 1.508931
2013-01-04 0.843435 -0.475088 0.241588 1.428372
2013-01-05 1.207635 -0.462329 -0.080737 -1.677173
2013-01-06 -0.374454 0.297715 -0.815562 -0.574843
'''
添加数据并打印:
df2['E']=['one','one','two','three','four','three'] # 添加一列数据
# 提取df2中'E'中包含['two','four']的行
print(df2[df2['E'].isin(['two','four'])])
# 输出:
'''
A B C D E
2013-01-03 1.326804 -0.272038 -0.602406 1.508931 two
2013-01-05 1.207635 -0.462329 -0.080737 -1.677173 four
'''
添加和修改数据:
# 为DataFrame创建一个新的列,其值为时间顺序的索引值
s1=pd.Series([1,2,3,4,5,6],index=pd.date_range('20130101',periods=6))
print(s1)
df['F']=s1
# 按标签赋值
df.at[dates[0],'A']=0
# 按索引赋值
df.iat[0,1]=0
# 使用numpy数组赋值
df.loc[:,'D']=np.array([5]*len(df))
print(len(df))
print(df)
# 输出:
'''
A B C D E
2013-01-03 1.326804 -0.272038 -0.602406 1.508931 two
2013-01-05 1.207635 -0.462329 -0.080737 -1.677173 four
'''
添加数据并打印:
#创建Dataframe对象,以dates[0:4]为索引,在df基础上再加一个新的‘E’列
df1=df.reindex(index=dates[0:4],columns=list(df.columns)+['E'])
#将'E'列的前两个行设为1
df1.loc[dates[0]:dates[1],'E']=1
print(df1)
# 输出:
'''
A B C D E
2013-01-03 1.326804 -0.272038 -0.602406 1.508931 two
2013-01-05 1.207635 -0.462329 -0.080737 -1.677173 four
'''
处理缺失数据:
# 处理缺失数据
# 调用 dropna 方法来删除 DataFrame 中含有任何 NaN 值的行
df1.dropna(how='any')
# 使用5填充缺省值
df1.fillna(value=5)
# 判断df1中的值是否为缺失数据,返回True/False
pd.isnull(df1)
# 输出:
'''
A B C D E
2013-01-01 False False False False False
2013-01-02 False False False False False
2013-01-03 False False False False True
2013-01-04 False False False False True
'''
构建一个数据表:
df=pd.DataFrame([[1,1,1,1],[2,2,2,2],[3,3,3,3]],columns=['col1','col2','col3','col4'])
df
# 输出:
'''
col1 col2 col3 col4
0 1 1 1 1
1 2 2 2 2
2 3 3 3 3
'''
计算每一列数据平均值:
print(df.mean(axis=0)) # mean(axis=0)计算的是每一列平均值,
# 输出:
'''
col1 2.0
col2 2.0
col3 2.0
col4 2.0
dtype: float64
'''
添加数据并打印:
print(df.mean(axis=1)) # mean(axis=1)计算每一行数据平均值
# 输出:
'''
0 1.0
1 2.0
2 3.0
dtype: float64
'''
删除某行:
print(df.drop(0,axis=0)) # drop(0,axis=0)删除第0行,
# 输出:
'''
col1 col2 col3 col4
1 2 2 2 2
2 3 3 3 3
'''
删除某列:
print(df.drop('col1',axis=1)) #drop([‘col1’],axis=1)删除列
# 输出:
'''
col2 col3 col4
0 1 1 1
1 2 2 2
2 3 3 3
'''
重新设置索引:
df = pd.DataFrame([('bird', 389.0),
('bird', 24.0),
('mammal', 80.5),
('mammal', np.nan)],
index=['falcon', 'parrot', 'lion', 'monkey'],
columns=('class', 'max_speed'))
df
# 输出:
'''
class max_speed
falcon bird 389.0
parrot bird 24.0
lion mammal 80.5
monkey mammal NaN
'''
舍弃旧的索引:
# 舍弃旧的索引,索引重置为默认的整数索引
df.reset_index(drop=True) # 原来的索引将被完全丢弃,不会保留为数据列
# 输出:
'''
class max_speed
0 bird 389.0
1 bird 24.0
2 mammal 80.5
3 mammal NaN
'''
改变表中的数据:
# 改变df
df.reset_index(drop=True,inplace=True) # 参数inplace=True决定操作是直接在原DataFrame(df)上修改还是返回一个新的DataFrame
df # 此时df已经改变
# 输出:
'''
class max_speed
0 bird 389.0
1 bird 24.0
2 mammal 80.5
3 mammal NaN
'''
以上内容总结自网络,如有帮助欢迎转发,我们下次再见!