本文包括以下几部分
数据筛选
数据统计
空值/NaN处理
字符类型处理
时间序列类型处理
数据筛选
按照筛选方式的不同,可以将数据筛选分为以下两种:
两者的区别在于前者返回满足条件的数据,后者将不满足条件的以NaN值填充。
#测试数据
data = pd.read_excel('test.xlsx',index_col=0)
使用表达式/布尔值筛选,即直接在“下标”中写出过滤条件,返回满足条件的数据。
#查看性别为女的数据
data[data['性别'] == '女']
使用where()方法筛选数据,通过DataFrame.where(表达式) 可以筛选出满足条件的数据,同时不满足表达式的数据将以“NaN”值填充并一起返回。
data.where(data['年龄']>17)
数据统计
pandas提供一些函数实现对Series/DataFrame数据常见的数学或统计计算。
普通统计函数:
count() #统计非空值
mean() #平均值
median() #中位数
min() #最小值
max() #最大值
std() #标准差
var() #方差
cov() #协方差矩阵
corr() # 连续变量的相关系数
describe() #统计汇总
分组/交叉统计:
groupby() # 和SQL分组指令一样。
pivot_table(
values=None,
index=None,
columns=None,
aggfunc='mean',
fill_value=None,
margins=False,
dropna=True,
margins_name='All',
observed=False,
)
#样例数据2
np.random.seed(20220518) #随机种子
data1 = pd.DataFrame(np.random.normal(2,3,(100,5)),
columns=['a','b','c','d','e'])
data1.head()
|
输出: 2.486358794605031 2.4862.127531746420967 9.90200833974934 |
使用describe()方法完成快速统计
data1.describe()
以上是针对数值类型做统计计算,当对非数据类型运行describe()时,将统计以下内容:
count() #非空数据
unique()#去掉重复值的数量
top() # 出现频率最多的值
frep() #top值的数量
|
count 6 unique 2 top 男 freq 4 Name: 性别, dtype: object |
空值/缺失值处理
本节介绍DataFrame处理缺失值的四个重要函数:
#样例数据2
data2 = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))
data2
#判断为空值
data2.isnull()
#判断非空值
data2.notnull()
#删除空值 --默认按行 axis=0 或 axis='index'
data2.dropna()
当指定axis=0/axis='index'时(默认),凡是一行包含缺失值,则整行删除。因此上面返回空。
当指定axis=1/axis='columns'时,凡是此列中包含空值,则整列删除。如下
#删除空值-- 按列 axis=1 或 axis='columns'
data2.dropna(axis=1)
#填充空值--指定值100填充全部空值
data2.fillna(value=100)
#填充空值--指定列和对应列填充值
fill_values = {'A': 8, 'B': 9, 'C': 99, 'D': 66}
data2.fillna(value=fill_values)
#填充空值--指定填充方式method 默认None
#向后填充 method='bfill'
data2.fillna(method='bfill')
data2.fillna(method='bfill',axis=1)
#向前填充 method='ffill'
data2.fillna(method='ffill')
原始 |
向后填充 |
向后填充,且axis=1 |
向前填充 |
字符类型处理
Pandas提供一些类似python的字符处理函数,来高效的处理字符串。
这些函数可以非常方便的操作字符串类型的Series对象(DataFrame的一列就是一个Series)。
区别于Pytho操作字符串的函数/方法,Pandas中用来处理字符类型的Series通常以str开头。方法名字和Python内置字符串处理函数大多数一样。
此外,特别介绍一下在机器学习特征工程中常用的两个特殊方法get_dummies()-哑变量生成 和 to_nuumeric()-数值类型修复。
常见字符处理函数:
#大小写转换
str.lower()
str.upper()
#空白处理
str.strip()
str.lstrip()
str.rstrip()
#拆分
str.split()
#切片
str.slice()
#替换
str.replace()
#拼接
str.cat() #按照索引位置拼接
str.join() #指定连接符拼接
#判断包含子字符串
str.contain()
str.startswith()
str.endswith()
str.match()
str.findall() #提取符合指定正则模式的片段
#子字符串提取
str.extract()
str.extractall()
#样例数据3
data3 = pd.DataFrame({'a':['甲','乙',np.nan,'丁'],
'b':['A','B','C','D']})
data3
cat()会按照索引进行拼接,遇到NaN会自动跳过。
指定连接符和NaN值填充
其余常见自符处理函数和Python自带的函数大多类似,因此例子省略。
get_dummies()
常常使用get_dummies()来处理某一列具有固定分隔符的字符串,使其生成哑变量。该方法在机器学习特征工程中十分常用。
to_nuumeric()
使用Pandas导入外部文件时,当一列原本为数据类型的数据,某一单元格混入非数值的字符串时,将导致本来应为数据类型的值被转为Object类型。
如以下一个文件,C7单元格错入一个字符‘-’。
pandas读取文件并查看信息如下:
月薪这一列的数据类型变成了Object类型。
使用to_numeric() ,参数errors='coerce' 即可将其转为数据类型,并将不合法的异常值置为NaN。
变为NaN后就可以根据NaN值处理方法来处理了。十分好用~
日期与时间序列处理
这部分介绍时间日期类型定义及pandas日期时间序列的常见处理方法。
日期时间生成基础
使用 datetime 包。
1.dateutil包的parser
2.pandas的to_datetime()
1. date_range()
2.period_range()
定义生成 |
12:34:56 2022-12-01 12:32:56 |
解析生成(从非标准的包含日期时间内容的字符串中解析) |
使用dateutil包
datetime.datetime(2022, 5, 24, 0, 0) |
pandas的to_datetime()方法
Timestamp('2022-05-24 00:00:00') |
时间序列生成
date_range()
pd.date_range(
start=None,
end=None,
periods=None,
freq=None
)
period_range()
pd.period_range(start=None,
end=None,
periods=None,
freq=None,
name=None
)
时间序列索引
Pandas中时间类型可以作为索引,生成方法为Pandas的DatetimeIndex().
DateIndex = pd.DatetimeIndex(['2021-2-1','2021-3-1','2022-4-1','2022-5-1'])
data5 = pd.Series([1,2,3,4],index=DateIndex)
data5
2021-02-01 1 2021-03-01 2 2022-04-01 3 2022-05-01 4
dtype: int64
时间类型索引和普通索引一样使用。
data5['2022-02-01']
此外,pandas支持时间序列索引筛选,比如只看2022年的,索引会自动过滤掉其他年份的索引值。
data5['2022']
日期时间索引处理函数:
pct_change() -计算当前值与前一个值的变化率。
rolling() -对数据范围应用函数。
between_time() - 选取指定时间段的数据。
resample - 指定时间序列的频率采样。