学习笔记

Series与DataFrame常用属性

Series

Series使用特性

Series支持array的特性(下标):

从ndarray创建Series:Series(arr):
b=np.arange(10)
s=pd.Series(b)
或者
a=np.array([1,2,3])
s=pd.Series(a)

与标量运算:Series*2,返回结果索引不变,Series中的数值经过运算全部乘以2

如果是2个Series之间进行运算,比如进行相加,那么只有他们索引值相同的部分进行运算,索引值不同的部分在返回结果中是NaN
如果两个Series相加,但存在索引值不匹配的情况,为了避免返回NaN,可以设置在索引值缺失时填充为0.用法如下:
s1.add(s2,fill_value=0)

支持通过索引来选择元素,注意如果填入2个索引来选择2个元素与,需要2个中括号:print(s[[0,2]])
Series支持切片:s[0:7] 选择Series中0到6的元素
当index是整数值的时候,使用s[0]这样的方式选择Series中的元素,是通过index来选择元素,而不是选择Series元素中的第十个,有些Series的index起始值可能不是从0开始,因此如果不注意可能会引发问题
通过自定义的索引切片,切出来的内容包含起始值与最终值:
d={‘a’:1,’b’:2,’c’:3}
s=pd.Series(d)
print(s[‘a’:’c’])      #包含索引值为C的内容

如果Series的索引是字符串类型,比如a\b\c\d,那么选择元素的语法格式应该是s[‘a’]这样的:
d={‘a’:1,’b’:2}
s=pd.Series(d)
print(s[‘a’])

Series支持通用函数,比如np.sum(s) 计算Series中所有数值之和
布尔值过滤:s[s>6]选择大于6的元素

Series支持字典的特性(标签):

从字典创建Series:
d= {‘a’: 1, ‘b’: 2}
s=pd.Series(d)
in运算(索引值是否包含某个元素):’a’ in s
键索引:s[‘a’],s[[‘a’,’b’,’c’]]

Series缺失值处理

检查Series中是否有缺失值,可以通过Series.isnull(),会返回跟一个原Series相同形状相同index的Series,但是之前缺失值的位置会被填充True,非缺失值的位置填充False
与Series.isnull()功能相反的是Series.notnull(),会在非缺失值的位置表示True,缺失值的位置表示False
删除Series中的缺失值,可以通过s.dropna(inplace=True),缺失值的元素与索引会被删除,仅保留非缺失值的部分
还可以将指定的内容替换掉Series中的缺失值,比如将Series中的所有NaN都替换成0:s.fillna(0,inplace=True)
计算Series.mean()会自动跳过缺失值,也就是会将非缺失值的行相加,然后除以非缺失值的行数

DataFrame

DataFrame常用属性

index获取索引
T转置
columns获取列索引
df.values 获取DataFrame中所有的值,返回的是一个numpy.ndarray(二维数组),忽略行标签与略标签,表中每行素具作为一个列表,全都装在一个大列表中
describe()获取快速统计,返回数据包中,类型为数字的列,每列的行数、平均数、标准差、最小值、最大值、中位数、25%位数以及75%位数

DataFrame索引

DataFrame是一个二维数据类型,所以有行索引和列索引
DataFrame同样可以通过列标签和位置两种方法进行索引和切片
loc和iloc的使用方法是,参数需要填写行索引与列索引,逗号隔开,行/列索引部分可以是常规索引、切片、布尔值索引、花式索引任意搭配

DataFrame选择某一个位置的值,可以先选择列标签,再选择行标签,比如:df[‘列标签’][‘行列索引’],但一般更推荐loc或iloc,但是loc需要先选择行索引,再选择列标签比如df.loc[‘行索引’,’列标签’]

通过df.loc[]选择DataFrame一行的数据,可以输入df.loc[行索引,:],行索引可以使行标签的文本或index索引数值,逗号后面的冒号也可以不填写,在返回结果中,在原本DataFrame中的列标签会变成行标签,原DataFrame列标签中对应的值会变成返回结果中行标签对一个的值,相当于进行了行列转换

df.loc选择指定多行,在方括号内的行索引还需要使用方括号包围,比如df.loc[[‘行索引1′,’行索引2’],],或者df.loc[[‘行索引1′,’行索引2’],[‘列标签1′,’列标签2’]]
如果是切片的方式,方括号里不需要再用方括号,比如df.loc[‘Arry’:’Eorge’,[‘Q1′,’Q2’]]

DataFrame数据对其与缺失数据处理

两个DataFrame之间可以进行加法操作(df1+df2),列标签与行索引相同的位置,如果是字符串类型,会进行文本拼接,数值类型就是数学加法运算,如果一个df中的位置,在另一张DataFrame中找不到相同列标签行索引位置的值,那么在返回结果中,这个位置会被填充为NaN
也就是说,两张DataFrame相加,再返回结果中,同样列标签与行索引的位置会进行文本拼接或数学相加,df1某个值在df2中的相同位置找不到同类型的值,在该位置会返回NaN

通过df.fillna(0)与df.dropna()可以对DataFrame中的空值进行处理,前者会将控制部分填充为0,而后者,默认情况下,如果在某一行中发现空值,整一行都会被删除,如果要设置,只有是整一行全都是NaN的情况下才将这一行删除,可以加入参数:df.dropna(how=’all’),默认how的参数是’any’
如果要设置,如果发现一个NaN,则删除NaN所在的一整列,可以设置df.dropna(axis=1),默认axis参数是0

将DataFrame中某些位置填充为NaN:
import numpy as py
df.loc[‘列标签’,’行索引’]=np.nan

pandas其他常用方法

mean(axis=0,skipna=False)对列/行求平均值,返回结果是一个Series,会忽略非数值类型的列,如果一列是数值类型但其中有个NaN,也会将NaN完全忽略,并且原DataFrame中的列标签会变成行标签(索引index),然后放上他们各自在原DataFrame中下面所有数字的平均值
如果要计算每一行的平均值,则是df.mean(axis=1)

sum(axis=1)对列/行求和

sort_index(axis,…,ascending) 对列/行索引排序,如果按列标签(表头)这一行排序,那就是df.sort_index(axis=1),但如果按表头这一行来排序,在ascending=True的情况下,数值列似乎会排在文本列的前面,先对所有的数值列按升序排序,然后在排列文本列?
sort_values(by=”列标签,axis,ascending=True)_按某一列/行的值进行排序,ascending=True表示升序(从小到大),如果设置按某一行中的内容来排序,需要设置axis=1
如果排序时存在NaN,NaN这一列/行不参与排序,会被放在最后
NumPy的通用函数同样适用于pandas

时间对象处理

datetime库键字符串转换成日期时间
import datetime
print(datetime.datetime.strptime(‘2001-01-01′,’%Y-%m-%d’))
返回2001-01-01 00:00:00

dateutil库可以自动识别各种格式的日期字符串,包括年/月/日、年-月-日、月-日-年、’JAN/03/2001’、’2001-JAN-01’,可以方便的将各种日期格式的文本转换成时间对象,安装pandas会自动安装该库
dateutil.parser.parse(‘2001-01-01’)

pandas可以通过pd.to_datetime()_可以批量地将时间格式字符串转换成DatetimeIndex,可以用来做索引:
dt1=’JAN/03/2001′
dt2=’2002-02-02′
print(‘—‘)
print(pd.to_datetime([dt1,dt2]))_
返回结果:
DatetimeIndex([‘2001-01-03’, ‘2002-02-02′], dtype=’datetime64[ns]’, freq=None)

时间对象生成

pd.date_range()可以创建日期范围:pd.date_range(‘2022-01-01′,’2022-06-01’)
可以被用来当做DataFrame或Series的索引:
s=pd.Series(np.arange(100),index=pd.date_range(‘2022-11-11’,periods=100))
print(s)

可以只设置起始日期不设置结束日期,但需要通过periods设置偏移量:’2022-01-01′,periods=60),periods=1表示只包含起始日期,periods=2表示只包含起始日期与起始日期后一天,以此类推
起始日期必须要在结束日期之前
freq参数可以设置频率,默认以天为单位,可以设置以每小时为单位,freq=’H’,
与periods参数搭配,参数为B只算工作日
常用的参数为D、H、W、B、SM(半月)、T、S、A,甚至可以是’1h20min’
freq参数详细:
默认freq = ‘D’:每日历日

B:每工作日
H每小时
T/MIN:每分
S:每秒
L:每毫秒(千分之一秒)
U:每微秒(百万分之一秒)
W-MON:从指定星期几开始算起,每周
星期几缩写:MON/TUE/WED/THU/FRI/SAT/SUN
WOM-2MON:每月的第几个星期几开始算,这里是每月第二个星期一
M:每月最后一个日历日
MS:每月第一个日历日
Q-月:指定月为季度末,每个季度末最后一月的最后一个日历日
月缩写:JAN/FEB/MAR/APR/MAY/JUN/JUL/AUG/SEP/OCT/NOV/DEC
所以Q-月只有三种情况:1-4-7-10,2-5-8-11,3-6-9-12
QS-月:指定月为季度末,每个季度末最后一月的第一个日历日
A-月:每年指定月份的最后一个日历日
AS-月:每年指定月份的第一个日历日
BM:每月最后一个工作日
BMS:每月第一个工作日
BQ-月:指定月为季度末,每个季度末最后一月的最后一个工作日
BQS-月:指定月为季度末,每个季度末最后一月的第一个工作日
BA-月:每年指定月份的最后一个工作日
BAS-月:每年指定月份的第一个工作日

时间序列

时间序列就是以时间对象为索引的Series或DataFrame
datetime对象作为索引时被存储在DatetimeIndex对象中
时间序列特殊功能有:
传入‘年’或‘年月’作为切片方式
传入日期范围作为切片方式
丰富的函数支持:包括resample()、truncate()等

s=pd.Series(np.arange(100),index=pd.date_range(‘2022-11-11’,periods=100))_
如果以时间对象作为索引,可以通过指定具体日期、月、年来选择Series或DataFrame中的行
比如:
s[‘2022-12-01’]取具体日期的值
s[‘2022-12’]取该月的所有值
s[‘2022’]取这一年内的所有值
也可以通过切片的方式指定时间范围:s[‘2022-12′:’2023-1-1’],返回对象中从2022年12月开始至2023年1月1日区间的所有值
返回结果包含时间索引以及对应的数据
通过resample方法,每7天数据求和:s.resample(‘W’).sum()
truncate方法可以进行截断,相当于进行切片操作,比如before=’2023-1-1′),返回结果中不包含早于2023年1月1日的数据,与before参数对应的是after

文件读取

pandas读取文件后,将日期格式的列转换为日期数据类型,可以使用parse_dates=True_将所有能转换成日期格式的列都换换位时间型数据
parse_dates参数_也可以指定列:pd.read_csv(‘1.csv’,parse_dates=[‘日期’])

header=None参数可以不使用原数据的表头,而是使用从0开始的序列数作为表头
还可以通过names参数自定义列标签
na_values可以指定哪些字符串表示缺失值_避免因为特殊值值而导致整列数据无法成为数字类型:
na_values=[‘None’,’non’]_,

文件处理to_csv()_

na_rep_可以将缺失值位置填充为指定字符串
header=False可以在输出文件时忽略表头
index=False在输出文件时忽略索引
cols可以指定输出哪些列

1 thought on “Series与DataFrame常用属性”

发表回复